原文:http://blog.csdn.net/sundy_2004/article/details/7259614
我們可以對圖像做點事情嘗試擴大其動態範圍,對這個操作最常用的技術是直方圖均衡化,可以將比較淡的圖像變換爲比較深的圖像(即增強圖像的亮度及對比度)。直方圖均衡化後面潛在的數學原理是一個分佈(輸入的亮度直方圖)被映射到另一個分佈(一個更寬,理想統一的亮度值分佈),映射函數是一個累積分佈函數。對於連續分佈,結果將是準確的均衡化。在cvEqualizeHist中,原始圖像及目標圖像必須是單通道,大小相同的8位圖像,對於彩色圖像,必須先將每個通道分開,再分別進行直方圖均衡化處理,然後將通道合併形成新的圖像。
----------------------------------------------------------------------------------------------
Split |
Split |
Merge |
Merge |
EqualizeHist
灰度圖象直方圖均衡化
void cvEqualizeHist( const CvArr* src, CvArr* dst );
src
輸入的 8-比特 單信道圖像
dst
輸出的圖像與輸入圖像大小與數據類型相同
函數 cvEqualizeHist 採用如下法則對輸入圖像進行直方圖均衡化:
1. 計算輸入圖像的直方圖 H
2. 直方圖歸一化,因此直方塊和爲255
3. 計算直方圖積分:
4. 採用H'作爲查詢表:dst(x,y)=H'(src(x,y))進行圖像變換。
該方法歸一化圖像亮度和增強對比度。
----------------------------------------------------------------------------------------------
/*code*/
- #include <highgui.h>
- #include <cv.h>
- int main(int argc, char** argv)
- {
- int i;
- IplImage* src = cvLoadImage( argv[1], 1 );
- IplImage* imgChannel[4] = { 0, 0, 0, 0 };
- IplImage* dst = cvCreateImage( cvGetSize( src ), IPL_DEPTH_8U, 3 );
- if( src )
- {
- for( i = 0; i < src -> nChannels; i++ )
- {
- imgChannel[i] = cvCreateImage( cvGetSize( src ), IPL_DEPTH_8U, 1 ); //要求單通道圖像才能直方圖均衡化
- }
- //通道分離
- cvSplit( src, imgChannel[0], imgChannel[1], imgChannel[2], imgChannel[3] );//BGRA
- for( i = 0; i < dst -> nChannels; i++ )
- {
- //直方圖均衡化,原始圖像和目標圖像必須是單通道
- cvEqualizeHist( imgChannel[i], imgChannel[i] );
- }
- //通道組合
- cvMerge( imgChannel[0], imgChannel[1], imgChannel[2], imgChannel[3], dst );
- cvNamedWindow( "src", 1 );
- cvShowImage( "src", src );
- cvNamedWindow( "Equalize", 1 );
- cvShowImage( "Equalize", dst );
- cvWaitKey(0);
- //釋放資源
- for( i = 0; i < src -> nChannels; i++ )
- {
- if( imgChannel[i] )
- {
- cvReleaseImage( &imgChannel[i] );
- //imgChannel[i] = 0;
- }
- }
- cvReleaseImage( &dst );
- }
- return 0;
- }