【问题标题】:OpenCV modify image pixels [duplicate]OpenCV修改图像像素[重复]
【发布时间】:2017-09-26 12:13:34
【问题描述】:

我想修改图像的每个像素。但结果并不像我预期的那样。

原图:

结果:

for循环修改每个像素:

image = imread("image.png", CV_LOAD_IMAGE_COLOR)
unsigned char value;

for (int col = 0; col < image.cols; col++){
   for (int row = 0; row < image.rows; row++){
        value = image.at<unsigned char>(row,col);
        value *= 0;
        image.at<unsigned char>(row, col) = value;
   }
}

所以我不知道错误在哪里,我想问你是否知道答案。

【问题讨论】:

    标签: c++ image opencv image-processing


    【解决方案1】:

    对于 3 通道 unsigned char 图像,您需要在遍历行和列时使用 Vec3b 访问所有 3 个通道。

    image = imread("image.png", CV_LOAD_IMAGE_COLOR)
    Vec3b value;
    
    for (int row = 0; row < image.rows; row++){
       for (int col = 0; col < image.cols; col++){
            //Vec3b as typename
            value = image.at<Vec3b>(row,col);
            value *= 0;
            image.at<Vec3b>(row, col) = value;
       }
    }
    

    【讨论】:

    • 由于对所有像素都进行了相同的操作,我更喜欢矩阵表达式——更快更简洁。 |考虑到 OP 乘以 0,一个简单的 setTo 甚至只是一个标量赋值都可以。
    • @DanMašek 是的,还有许多其他方法(例如矩阵乘法、按位运算、parallel_for 等)来执行此操作。但是,由于 OP 似乎是 CV 的初学者并且有兴趣访问每个像素,因此我给出了相应的答案。
    猜你喜欢
    • 2021-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-13
    相关资源
    最近更新 更多