如何在opencv中更改实验室垫中的像素

Posted

技术标签:

【中文标题】如何在opencv中更改实验室垫中的像素【英文标题】:how to change pixels in lab mat in opencv 【发布时间】:2018-10-08 09:07:12 【问题描述】:

我想将 bgr mat 转换为实验室垫。然后改变mat中的一些像素。之后,我恢复图像。

int main() 
    Mat originalMat = imread("E:\\cworkspace\\Opencv\\Opencv\\test3.jpg");
    if (originalMat.empty()) 
        cout << "load failed" << endl;
        return -1;
    
    else 
        cout << "load success" << endl << endl;
    
    Rect  rect = Rect(50, 50, 300, 300);
    Mat roi_img = originalMat(rect);
    cvtColor(originalMat, originalMat, COLOR_BGR2Lab);

    for (int i = 1; i < roi_img.rows; i++) 
        for (int j = 1; j < roi_img.cols; j++) 
            roi_img.at<Vec3b>(i, j)[0] = 0;
            roi_img.at<Vec3b>(i, j)[1] = 0;
            roi_img.at<Vec3b>(i, j)[2] = 0;
        
    
    cvtColor(originalMat, originalMat, COLOR_Lab2BGR);
    imshow("originalMat", originalMat);
    waitKey();
    return 0;

这是我的简化代码。最终投资回报率变成了蓝色。根据我的理解。它应该是黑色的。

【问题讨论】:

当使用 8 位无符号值时,(0,0,0) 在 Lab 中不是黑色的。参见the docs -- ab 偏移 128。 【参考方案1】:

我认为您应该将&lt;Vec3b&gt; 替换为&lt;Vec3f&gt;,因为在BGR2Lab 转换后,输出图像的类型将是float,因此&lt;Vec3b&gt; 会写入无意义的值。 我的意思是这样做:

roi_img.at<Vec3f>(i, j)[0] = 0;
roi_img.at<Vec3f>(i, j)[1] = 0;
roi_img.at<Vec3f>(i, j)[2] = 0;

【讨论】:

以上是关于如何在opencv中更改实验室垫中的像素的主要内容,如果未能解决你的问题,请参考以下文章

如何从 OpenCV Python 中的特征匹配中获取像素坐标

C中的OpenCV拼接器例程,如何获得像素变换?

如何通过opencv获取连接组件中的所有像素?

OpenCV如何更改摄像头分辨率?

如何使用带有c ++的opencv库将下图中的黑色像素更改为红色像素

无法更改图像 Mat opencv 中的所有像素