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

时间:2018-10-08 09:07:13

标签: c++ opencv

我想将bgr mat替换为lab 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;
}

这是我的简化代码。最终,ROI被更改为蓝色。据我了解,它应该是黑色的。

enter image description here

1 个答案:

答案 0 :(得分:0)

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

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