OpenCV中的Mat创建图像

3

我正在尝试加载BGR图像,然后将满足某些条件的一些像素复制到新图像中,该图像是使用加载图像的宽度、高度和类型创建的。该类型为CV_8UC3。

Mat initial_Image = imread("image.jpg");
Mat image(img.rows,img.cols, CV_8UC3);

cout<<initial_Image.type()<<endl;

for(int i = 0;i < img.cols ;i++)
{
for(int j = 0;j < img.rows ;j++)
{
Vec3b intensity = initial_Image.at<Vec3b>(j,i);
uchar blue = intensity.val[0];
uchar green = intensity.val[1];
uchar red = intensity.val[2];


image.at<uchar>(j,i) = blue;
image.at<uchar>(j+1,i+1) = green;
image.at<uchar>(j+2,i+2) = red ;

    }
}
out.close();

imshow("im", image);

我没有设置条件,但我尝试将读取图像中的所有相应像素复制到新创建的图像中。
我的问题是,读取的图像是三通道的RGB图像,但是当我通过将像素复制到新创建的图像中来绘制图像时,它会给我一个黑白图像,其值除以3。为什么?由于我必须根据某些条件更改像素值,因此我不能使用一些人建议的copyto函数。我之所以不设置条件是为了方便纠正工作。谢谢。
1个回答

5
你索引image的方式不正确。当前你索引image的方式会将blue写入到j, i的位置,然后当你到达下一列时,蓝色像素将被写入到j+1,i+1,从而覆盖了绿色值。相反,你应该使用.at<Vec3b>来索引image
最简单的方法是这样做:
image.at<Vec3b>(j,i) = initial_Image.at<Vec3b>(j,i);

如果你想要更改红色蓝色绿色,也可以这样做:

Vec3b intensity = initial_Image.at<Vec3b>(j,i);
uchar blue = intensity.val[0];
uchar green = intensity.val[1];
uchar red = intensity.val[2];

//Do stuff with blue, green, and red

image.at<Vec3b>(j,i) = Vec3b(blue,green,red);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接