【问题标题】:Opencv Mat create ImageOpencv Mat 创建图像
【发布时间】:2013-05-12 11:28:15
【问题描述】:

我正在尝试加载 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 功能。我不设置条件的原因是为了简化完成更正的工作。感谢你。

【问题讨论】:

    标签: opencv image-processing


    【解决方案1】:

    您索引image 的方式不正确。当前索引image 的方式会将blue 写入索引j,i,然后当您到达下一列时,一个蓝色像素将被写入j+1,i+1,从而有效地覆盖绿色值。相反,您应该使用.at&lt;Vec3b&gt; 索引image

    最简单的方法是这样做:

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

    如果您想更改redbluegreen,您也可以这样做:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多