【轉】直方圖均衡化

原文:http://blog.csdn.net/sundy_2004/article/details/7259614

我們可以對圖像做點事情嘗試擴大其動態範圍,對這個操作最常用的技術是直方圖均衡化,可以將比較淡的圖像變換爲比較深的圖像(即增強圖像的亮度及對比度)。直方圖均衡化後面潛在的數學原理是一個分佈(輸入的亮度直方圖)被映射到另一個分佈(一個更寬,理想統一的亮度值分佈),映射函數是一個累積分佈函數。對於連續分佈,結果將是準確的均衡化。在cvEqualizeHist中,原始圖像及目標圖像必須是單通道,大小相同的8位圖像,對於彩色圖像,必須先將每個通道分開,再分別進行直方圖均衡化處理,然後將通道合併形成新的圖像。

----------------------------------------------------------------------------------------------

Split

Split
分割多通道數組成幾個單通道數組或者從數組中提取一個通道 

void cvSplit( const CvArr* src, CvArr* dst0, CvArr* dst1,
CvArr* dst2, CvArr* dst3 );
#define cvCvtPixToPlane cvSplit
src 
原數組. 
dst0...dst3 
目標通道 
函數 cvSplit 分割多通道數組成分離的單通道數組d。可獲得兩種操作模式 . 如果原數組有N通道且前N輸出數組非NULL, 所有的通道都會被從原數組中提取,如果前N個通道只有一個通道非NULL函數只提取該指定通道,否則會產生一個錯誤,餘下的通道(超過前N個通道的以上的)必須被設置成NULL,對於設置了COI的IplImage 結使用cvCopy 也可以從圖像中提取單通道。

 

Merge

Merge
從幾個單通道數組組合成多通道數組或插入一個單通道數組 

void cvMerge( const CvArr* src0, const CvArr* src1,
const CvArr* src2, const CvArr* src3, CvArr* dst );
#define cvCvtPlaneToPix cvMerge
src0... src3 
輸入的通道. 
dst 
輸出數組. 
函數cvMerge 是前一個函數的反向操作。如果輸出數組有N個通道並且前N個輸入通道非NULL,就拷貝所有通道到輸出數組,如果在前N個通道中只有一個單通道非NULL ,只拷貝這個通道到輸出數組,否則 就會產生錯誤。除前N通道以外的餘下的通道必須置NULL。對於設置了COI的 IplImage結構使用 cvCopy也可以實現向圖像中插入一個通道 。

 

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*/

[cpp] view plain copy
  1. #include <highgui.h>  
  2. #include <cv.h>  
  3.   
  4. int main(int argc, char** argv)  
  5. {  
  6.     int i;  
  7.     IplImage* src = cvLoadImage( argv[1], 1 );  
  8.     IplImage* imgChannel[4] = { 0, 0, 0, 0 };  
  9.     IplImage* dst = cvCreateImage( cvGetSize( src ), IPL_DEPTH_8U, 3 );  
  10.   
  11.     if( src )  
  12.     {  
  13.         for( i = 0; i < src -> nChannels; i++ )  
  14.         {  
  15.             imgChannel[i] = cvCreateImage( cvGetSize( src ), IPL_DEPTH_8U, 1 );  //要求單通道圖像才能直方圖均衡化  
  16.         }  
  17.         //通道分離  
  18.         cvSplit( src, imgChannel[0], imgChannel[1], imgChannel[2], imgChannel[3] );//BGRA  
  19.         for( i = 0; i < dst -> nChannels; i++ )  
  20.         {  
  21.             //直方圖均衡化,原始圖像和目標圖像必須是單通道  
  22.             cvEqualizeHist( imgChannel[i], imgChannel[i] );  
  23.         }  
  24.   
  25.         //通道組合  
  26.         cvMerge( imgChannel[0], imgChannel[1], imgChannel[2], imgChannel[3], dst );  
  27.         cvNamedWindow( "src", 1 );  
  28.         cvShowImage( "src", src );  
  29.         cvNamedWindow( "Equalize", 1 );  
  30.         cvShowImage( "Equalize", dst );  
  31.   
  32.         cvWaitKey(0);  
  33.         //釋放資源  
  34.         for( i = 0; i < src -> nChannels; i++ )  
  35.         {  
  36.             if( imgChannel[i] )  
  37.             {  
  38.                 cvReleaseImage( &imgChannel[i] );  
  39.                 //imgChannel[i] = 0;  
  40.             }  
  41.         }  
  42.         cvReleaseImage( &dst );  
  43.     }  
  44.   
  45.     return 0;  
  46. }  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章