1 直方圖均衡化
void cvEqualizeHist( const CvArr* src, CvArr* dst );//輸入 輸出,8位單通道圖像
opencv直方圖采用的方法:
- 計算輸入圖像的直方圖 H
- 直方圖歸一化,因此直方塊和為255
- 計算直方圖積分
- 采用H'作為查詢表:dst(x,y)=H'(src(x,y))進行圖像變換。
測試1 直方圖均衡化
直方圖均衡化
int i;
IplImage *pImageChannel[4] = { 0, 0, 0, 0 };
IplImage *pSrcImage = cvLoadImage( "24.jpg", 1 ) ;
IplImage *pImage = cvCreateImage(cvGetSize(pSrcImage), pSrcImage->depth, pSrcImage->nChannels);
if( pSrcImage )
{
for( i = 0; i < pSrcImage->nChannels; i++ )
{
pImageChannel[i] = cvCreateImage( cvGetSize(pSrcImage), pSrcImage->depth, 1 );
}
// 信道分離
cvSplit( pSrcImage, pImageChannel[0], pImageChannel[1],pImageChannel[2], pImageChannel[3] );
for( i = 0; i < pImage->nChannels; i++ )
{
cvEqualizeHist( pImageChannel[i], pImageChannel[i] ); // 直方圖均衡化
}
// 信道組合
cvMerge( pImageChannel[0], pImageChannel[1], pImageChannel[2],pImageChannel[3], pImage );
cvNamedWindow( "Source");
cvShowImage("Source",pSrcImage);
cvNamedWindow( "cvEqualizeHist");
cvShowImage( "cvEqualizeHist", pImage );
cvWaitKey(0);
測試圖像:
2 .直方圖對比
double cvCompareHist( const CvHistogram* hist1, const CvHistogram* hist2, int method );
對比的的方法用method表示,主要由以下幾種辦法:
CV_COMP_CORREL 相關方法:完全匹配為1,完全不匹配為-1,0是無關聯
CV_COMP_CHISQR 卡爾:完全匹配是0 ,完全不匹配為無限值
CV_COMP_INTERSECT 直方圖相交:完全匹配為1,完全不匹配為-1,0是無關聯
CV_COMP_BHATTACHARYYA Bhattacharyya距離,Bhattacharyya 距離只能應用到規一化后的直方圖,完全匹配是0 ,完全不匹配為1
在直方圖對比前,都應該進行歸一化操作,直方圖相交的方法效果最好,卡爾和Bhattacharyya距離速度最慢也較精確。
測試代碼:
直方圖對比
IplImage * image= cvLoadImage("myhand1.jpg");
IplImage * image2= cvLoadImage("myhand2.jpg");
int hist_size=256;
float range[] = {0,255};
float* ranges[]={range};
IplImage* gray_plane = cvCreateImage(cvGetSize(image),8,1);
cvCvtColor(image,gray_plane,CV_BGR2GRAY);
CvHistogram* gray_hist = cvCreateHist(1,&hist_size,CV_HIST_ARRAY,ranges,1);
cvCalcHist(&gray_plane,gray_hist,0,0);
cvNormalizeHist(gray_hist,1.0);
IplImage* gray_plane2 = cvCreateImage(cvGetSize(image2),8,1);
cvCvtColor(image2,gray_plane2,CV_BGR2GRAY);
CvHistogram* gray_hist2 = cvCreateHist(1,&hist_size,CV_HIST_ARRAY,ranges,1);
cvCalcHist(&gray_plane2,gray_hist2,0,0);
cvNormalizeHist(gray_hist2,1.0);
double com=cvCompareHist(gray_hist,gray_hist2,CV_COMP_CHISQR);
printf("%f\n",com);
cvNamedWindow( "myhand1");
cvShowImage("myhand1",image);
cvNamedWindow( "myhand2");
cvShowImage( "myhand2", image2 );
cvWaitKey();
輸出結果:
也就是這兩張圖像 並沒什么相關,如果和源圖像對比,輸出結果如下:
