我正在尝试将新的颜色值设置为某些像素到一个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] ..我仍然无法弄清楚输出图像中的像素颜色不会改变。 谢谢

有帮助吗?

解决方案

除了将新像素值复制回图像的情况下,您做了所有内容。

此行将像素的副本归入局部变量:

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

所以,在更改原因时,在更换生成的原因之后,只需将其设置为如下:

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>(Point(x,y));

        // ... do something to the color ....

        // set pixel
        image.at<Vec3b>(Point(x,y)) = color;
    }
}
.

其他提示

只需使用参考:

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)为您提供指向scanline y的指针。并迭代具有X和Y

的循环的像素

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top