ris*_*ish 3 opencv image-processing
我试图加载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);
Run Code Online (Sandbox Code Playgroud)
我没有放置条件,但我只是试图将读取的图像中的所有相应像素复制到新的创建图像中.
我的问题是读取的图像是3通道RGB,但是当我通过将像素复制到新创建的图像来绘制图像时,它给出了一个黑白图像除以3.为什么?因为我必须根据某些条件改变pixles值,所以我不能像有些人所说的那样使用copyto函数.我没有条件的原因是为了简化纠正工作.感谢你.
索引的image方式不正确.您索引的当前方式image将写入blue索引j,i,然后当您到达下一列时,将写入蓝色像素以j+1,i+1有效地覆盖绿色值.相反,你应该索引image使用.at<Vec3b>.
最简单的方法是这样做:
image.at<Vec3b>(j,i) = initial_Image.at<Vec3b>(j,i);
Run Code Online (Sandbox Code Playgroud)
如果你想改变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);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
16517 次 |
| 最近记录: |