c + +和opencv获取并将像素颜色设置为Mat
c++
image-processing
opencv
5
0

我正在尝试将一些像素的新颜色值设置为cv :: Mat图像,我的代码如下:

    Mat image = img;
    for(int y=0;y<img.rows;y++)
    {
        for(int x=0;x<img.cols;x++)
        {
        Vec3b color = image.at<Vec3b>(Point(x,y));
        if(color[0] > 150 && color[1] > 150 && color[2] > 150)
        {
            color[0] = 0;
            color[1] = 0;
            color[2] = 0;
            cout << "Pixel >200 :" << x << "," << y << endl;
        }
        else
        {
            color.val[0] = 255;
            color.val[1] = 255;
            color.val[2] = 255;
        }
    }
    imwrite("../images/imgopti"+to_string(i)+".tiff",image);

似乎在输出中(具有cout)获得了良好的像素,但是在输出图像中(具有imwrite),相关像素没有被修改。我已经尝试过使用color.val [0] ..我仍然不知道为什么输出图像中的像素颜色不会改变。谢谢

参考资料:
Stack Overflow
收藏
评论
共 3 个回答
高赞 时间 活跃

除了将新的像素值复制回图像之外,您已进行了所有操作。

这行将像素的副本复制到局部变量中:

Vec3b color = image.at<Vec3b>(Point(x,y));

因此,根据需要更改color后,只需将其设置为如下所示:

image.at<Vec3b>(Point(x,y)) = color;

因此,完全是这样的:

Mat image = img;
for(int y=0;y<img.rows;y++)
{
    for(int x=0;x<img.cols;x++)
    {
        // get pixel
        Vec3b & color = image.at<Vec3b>(y,x);

        // ... do something to the color ....
        color[0] = 13;
        color[1] = 13;
        color[2] = 13;

        // set pixel
        //image.at<Vec3b>(Point(x,y)) = color;
        //if you copy value
    }
}
收藏
评论

只需使用参考:

Vec3b & color = image.at<Vec3b>(y,x);
color[2] = 13;
收藏
评论

由于性能原因,我不会使用.at。

定义一个结构:

//#pragma pack(push, 2) //not useful (see comments below)
struct RGB {
    uchar blue;
    uchar green;
    uchar red;  };

然后像这样在cv :: Mat图片上使用它:

RGB& rgb = image.ptr<RGB>(y)[x];

image.ptr(y)为您提供指向扫描线y的指针。并通过x和y循环遍历像素

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号