在C++矩阵类中替换特定颜色的所有像素

3

1)我有一个矩阵类

Mat src = imread("/pic.png", 0)

http://i1265.photobucket.com/albums/jj502/anizilla/demo_result.png

我想将上述图像中的所有白色像素替换为黑色。

是否有一种方法可以用另一个特定的RGB值替换所有像素?

2)当我使用 -

src.col(0).row(0)

我得到了正确的数值,有没有办法提取每个RGB通道的值?
3) 当我使用 -
src.at<Vec2b>(0,0)[0];

我收到了垃圾值(例如“.”和“!”)。 如果我使用,我会遇到垃圾值。

但是。 当我使用

src.at<Vec2s>(0,0)[0];

我获取了通道0的正确值,而且

src.at<Vec2s>(0,0)[1];
src.at<Vec2s>(0,0)[2];

返回垃圾数字

1个回答

6
这很简单,只要你做对了。
  1. Use explicit template instantiation, e.g.

    Mat3b src = imread("/pic.png", 0);
    
  2. Use iterators:

    for (Mat3b::iterator it = src.begin(); it != src.end(); it++) {
        if (*it == Vec3b(255, 255, 255)) {
            *it = Vec3b(0, 0, 0);
        }
    }
    

很抱歉,第一个提出的解决方案(src.setTo(newMat, (src == old));)只适用于单通道矩阵。


ypnos,我的图像是Mat类的。我该如何将Mat src转换为Mat3b src? - Anirudh
ypnos,它会抛出一个错误:“错误:在‘src == old’中没有匹配的‘operator==’”。 - Anirudh
确保使用Mat3b使==正常工作。您可以只写Mat3b src2 = src; 或者像我的示例一样直接将src设置为Mat3b。 - ypnos
请发布代码,以便我可以尝试。我在自己的项目中使用类似的代码,所以一般来说我知道它是有效的。 - ypnos
#include "opencv2/highgui/highgui.hpp" #include "opencv2/imgproc/imgproc.hpp" using namespace cv;int main(int argc, char** argv) { Mat3b src3 = imread("/home/anirudh/demo_result.png", 0); Vec3b old1(0, 0, 0); Vec3b new1(255, 255, 255); src3.setTo(new1, (src3 == old1)); } - Anirudh
抱歉,确实缺少正确的重载,也许我可以为此提交一个功能请求。对不起!我马上会为您编写一个漂亮的循环。 - ypnos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接