我正在尝试加载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.为什么?因为我必须根据某些条件改变pixles值,所以我不能像有些人所说的那样使用copyto函数。我没有条件的原因是为了减轻完成修正的工作。感谢你。
答案 0 :(得分:5)
您索引image
的方式不正确。您索引image
的当前方式会将blue
写入索引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);