如何在Opencv中处理图像的特定部分 [英] How can I process a specific part of an Image in Opencv

查看:639
本文介绍了如何在Opencv中处理图像的特定部分的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I used copyMakeBorder to create a 100x100x100x100 border around my image. I would like to use cvtColor to convert only the part of the image that is inside the border to gray, so the border remains bgr, I don't want to have to use copyTo to copy something inside the border on the image, I would like to process the image in place. I looked all over google and there was no specific code example to do this. May I ask someone provide code example.

推荐答案

什么Ed.S建议是正确的 - 在opencv中,你不能从更大的图像并将其从rgb转换为灰度而不转换整个图像:

What Ed.S suggested is right - in opencv you cannot take some ROI from the bigger image and convert it in place from rgb to grayscale not converting whole image:

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中,什么不涉及复制,而是工作到位:

What you can do is to perform conversion to grayscale by hand in the selected roi, what does not involve copying, rather that works in place:

    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示例:

here's a lena example:

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);

结果:

这篇关于如何在Opencv中处理图像的特定部分的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆