4

この質問が非常に基本的なものである場合は申し訳ありません。私は OpenCV を初めて使用します。

RGB 画像にヒストグラム均等化を適用したいと考えています。HE は 1 つのチャンネルでしか機能しないため、画像を 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

そして、それが何を意味するのか、次に何をすべきなのか、私にはわかりません。

4

2 に答える 2

4

cvEqualizeHist次の行で関数を間違って使用しています。

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

imgは 3 チャンネルの画像でrgbはシングル チャンネルの画像です。cvEqualizeHist3 チャンネルの画像では機能しません。

次のことを行う必要があります。

cvEqualizeHist( r, r );    //equalise r
cvEqualizeHist( g, g );    //equalise g
cvEqualizeHist( b, b );    //equalise b
于 2013-02-05T13:32:03.897 に答える
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);
    
于 2013-02-05T14:04:12.397 に答える