2014-04-16 30 views
1

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

+3

你不能有一个单一的形象有两个或两个以上不同的像素格式(当然,据我所知。你当然可以自己编写格式,但是,呃,解析什么乱七八糟。)你当然可以使用灰度作为边界,或者使用bgr,其中r = g = b作为内部部分,但如果不是你需要更大的动态范围。在同一图像中寻找两个像素格式是一个错误,但您需要一个不同的解决方案。 –

回答

3

什么Ed.S建议是正确的 - 在OpenCV中你不能从更大的图片需要一些投资回报率,并从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; 
     } 

编辑:这里有一个莉娜例如:

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

+0

非常感谢 – user3517736