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);

我没有设置条件,但我只是尝试将读取图像中的所有相应像素复制到新的创建图像中。

我的问题是读取的图像是 3 通道 RGB,但是当我通过将像素复制到新创建的图像中来绘制图像时,它给了我一个除以 3 的黑白图像。为什么?由于一旦我根据某些条件开始工作,我就必须更改像素值,所以我不能像某些人建议的那样使用 copyto 函数。我不设置条件的原因是为了简化完成更正的工作。感谢你。

4

1 回答 1

5

您索引的image方式不正确。您当前的索引方式image将写入blueindex j,i,然后当您到达下一列时,将写入一个蓝色像素以j+1,i+1有效覆盖绿色值。相反,您应该image使用.at<Vec3b>.

最简单的方法是这样做:

image.at<Vec3b>(j,i) = initial_Image.at<Vec3b>(j,i);

如果你想改变red, blue,green你也可以这样做:

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);
于 2013-05-12T14:19:57.483 回答