OpenCV:对RGB图像应用操作(拆分+合并)

时间:2013-02-05 13:23:03

标签: c++ opencv

很抱歉,如果这个问题非常基础,我是OpenCV的新手。

我想将直方图均衡应用于RGB图像。 HE仅适用于单通道,所以我想我必须将图像分成3个不同的通道,将HE应用于每个通道,然后将它们合并在一起以形成输出均衡图像。

所以我做到了这一点,这是我的程序,我真的认为应该有效:

#include <iostream>
#include <stdio.h>
#include <cv.h>
#include <highgui.h>

int main(int argc, char * argv[])
{
IplImage* img = cvLoadImage("/Users/Documents/red.jpg");  //Load image file
cvNamedWindow("Trans-in", CV_WINDOW_AUTOSIZE );     //Create input window
cvNamedWindow("Trans-out", CV_WINDOW_AUTOSIZE  );   //Create output window

cvShowImage("Trans-in", img );  //Show input image in input window

//Create space for outputs rgb and its separate channels, r, g and b
IplImage* img0 = cvCreateImage(cvGetSize(img), IPL_DEPTH_8U, 3);    //rgb
IplImage* r = cvCreateImage(cvGetSize(img), IPL_DEPTH_8U, 1);    //r
IplImage* g = cvCreateImage(cvGetSize(img), IPL_DEPTH_8U, 1);    //g
IplImage* b = cvCreateImage(cvGetSize(img), IPL_DEPTH_8U, 1);    //b

//cvZero(r);
//cvZero(g);
//cvZero(b);

cvSplit(img, b, g, r, NULL);       //OpenCV likes it in BGR format

cvEqualizeHist( img, r );    //equalise r
cvEqualizeHist( img, g );    //equalise g
cvEqualizeHist( img, b );    //equalise b


cvMerge(b, g, r, NULL, img0);  //merge all separate channels together to output image rgb

//cvReleaseImage(&r);
//cvReleaseImage(&g);
//cvReleaseImage(&b);

cvShowImage("Trans-out", img0); //Show output image in output window


cvWaitKey(0);
cvReleaseImage( &img);
cvReleaseImage( &img0);

cvDestroyWindow( "Trans-in");
cvDestroyWindow( "Trans-out");

return 0;
}

道歉,如果//评论有点烦人,但它显示了我的'推理'我猜。在我点击“运行”按钮之前,Xcode没有抱怨。它基本上崩溃了(输入图像显示,但不是输出图像)。

在底部添加错误消息:

OpenCV Error: Assertion failed (CV_ARE_SIZES_EQ(src, dst) && CV_ARE_TYPES_EQ(src, dst) && CV_MAT_TYPE(src->type) == CV_8UC1) in cvEqualizeHist, file /opt/local/var/macports/build/_Volumes_work_mports_dports_graphics_opencv/opencv/work/OpenCV-2.4.3/modules/imgproc/src/histogram.cpp, line 2414 terminate called throwing an exception

我不知道它意味着什么或下一步该做什么。

2 个答案:

答案 0 :(得分:4)

您在以下行中错误地使用cvEqualizeHist功能:

cvEqualizeHist( img, r );    //equalise r
cvEqualizeHist( img, g );    //equalise g
cvEqualizeHist( img, b );    //equalise b

img是3频道图片,而rgb是单频道图片。 cvEqualizeHist不适用于3频道图片。

您必须执行以下操作:

cvEqualizeHist( r, r );    //equalise r
cvEqualizeHist( g, g );    //equalise g
cvEqualizeHist( b, b );    //equalise b

答案 1 :(得分:2)

用于对RGB图像进行直方图均衡...将其转换为HSV图像,然后均衡V平面...

  1. 将RGB转换为HSV
  2. 将HSV分成H,S和V
  3. 均衡V
  4. 合并H,S和V

    vector<Mat> hsv_planes;
    cvtColor(image,image,CV_BGR2HSV);
    split(image,hsv_planes);
    equalizeHist(hsv_planes[2],hsv_planes[2]);
    merge(hsv_planes,image);
    cvtColor(image,image,CV_HSV2BGR);