如何在Opencv中处理图像的特定部分

时间:2014-04-16 23:10:18

标签: c++ opencv

我使用copyMakeBorder在我的图像周围创建一个100x100x100x100边框。我想使用cvtColor只将边框内部的图像部分转换为灰色,所以边框仍然是bgr,我不想使用copyTo来复制图像边框内的东西,我会喜欢处理图像到位。我查看了谷歌,并没有具体的代码示例来做到这一点。我可以请某人提供代码示例。

1 个答案:

答案 0 :(得分:3)

Ed.S建议的是正确的 - 在opencv中,您不能从较大的图像中获取一些ROI并将其从rgb转换为灰度而不是转换整个图像:

Mat src(1024, 768, CV_8UC3);
src.setTo(Scalar(255, 200, 100));

Mat roi = src(Rect(100, 100, 300, 300));
cvtColor(roi, roi, CV_RGB2GRAY);  // nothing changed, still src is the same after cvtColor

您可以做的是在选定的roi中手动转换为灰度,不涉及复制,而是在适当的位置:

    Mat src(1024, 768, CV_8UC3);
    src.setTo(cv::Scalar(255, 200, 100));

    cv::imwrite("out.jpg", src);

    Mat roi = src(cv::Rect(100, 100, 300, 300));

    for(int i=0;i<roi.cols;i++)
        for(int j=0;j<roi.rows;j++) {
            cv::Vec3b p = roi.at<cv::Vec3b>(j,i);
            unsigned char lumination = (unsigned char)( 0.2126*p[2] + 0.7152*p[1] + 0.0722*p[0]);
            p[0] = p[1] = p [2] = lumination;   
            roi.at<cv::Vec3b>(j,i) = p;
        }

编辑:这是一个lena的例子:

Mat src = imread("lena.jpg");
Mat roi = src(cv::Rect(src.cols/4, src.cols/4, src.cols/2, src.rows/2));

for(int i=0;i<roi.cols;i++)
    for(int j=0;j<roi.rows;j++) {
        cv::Vec3b p = roi.at<cv::Vec3b>(j,i);
        unsigned char lumination = (unsigned char)( 0.2126*p[2] + 0.7152*p[1] + 0.0722*p[0]);
        p[0] = p[1] = p [2] = lumination;   
        roi.at<cv::Vec3b>(j,i) = p;
    }
cv::imwrite("out.jpg", src);

结果:

enter image description here