直方圖這個東西,是個好東西。所謂的直方圖,就是統計這個圖像當中intensity的分佈狀況。直方圖在圖像處理當中的用處仍是挺大的。函數
這裏咱們說一下直方圖的均衡問題。blog
首先,爲何要進行直方圖均衡?數學
咱們知道,在RGB色彩系統中,咱們能夠經過一個公式,將RGB色彩圖像轉換爲灰度圖像,這個公式就是Gray = R*0.299 + G*0.587 + B*0.114。經過這個公式,咱們就能對圖像中intensity有一些瞭解:若是一個像素點的RGB三色都比較大,那麼這個像素的色彩應當是偏向於白色的,他的intensity也會增大,RGB三色都比較小的時候,像素色彩偏向於黑色,intensity也會較暗。雖然RGB三色的不一樣組合表明了不一樣的顏色,可是,咱們這裏只考慮RBG三色根據上面公式所獲取的單一的數值大小,而這個數值大小也就是灰度值。咱們對於intensity的調整不會影響圖像的形狀和構造。固然,因爲這個公式屬於三元一次方程,解不肯定,所以,這個過程不可逆,也就是說,想要進行彩色圖案的色彩均衡,須要另一種辦法。it
既然是直方圖的均衡,咱們能夠認爲是圖像intensity的均衡。咱們使用的均衡方法的步驟是:圖像處理
一、統計各個intensity級數的像素個數,求出intensity級數像素數目所佔全部像素的比例。class
二、根據不一樣的intensity級數咱們分配不一樣的數值。方法
咱們之因此這麼作的緣由是:im
使用上面的步驟的緣由爲:一個圖像中的intensity級數分佈是沒有規律的,咱們之因此要進行直方圖均衡,是由於他可以加強圖像的對比圖,提高圖像的表現。第一步經過求出各個intensity的級數所佔的比例,就可以得出哪一個intensity級數佔的比例更大,哪一個更小。將比例做爲權重,且intensity級數越大,顯示效果更好。這就是用數學方法將佔比例小的intensity級數濾去。統計
假如咱們有以下數據:1,2,2,2,2,2,2,3,3,3,,4,4,4,,5。咱們能夠看到,這些數中,1,5的數量最少,2最多,其次是3,4。根據比例,1,5所佔比例最小,2最多。因此,2在這個數列中的權重最大,1,5最小;放到圖像中亦然。數據
代碼以下
int count=0; double *p=new double[256]; double *per=new double[256]; for(int i=0;i!=256;++i) p[i]=0; int *arr=new int[256]; for(int i=0;i!=256;++i) arr[i]=0; for(int i=0;i!=in.rows;++i) for(int j=0;j!=in.cols;++j) arr[in.at<uchar>(i,j)]++; for(int i=0;i!=256;++i) per[i]=double(arr[i])/double(in.cols*in.rows); for(int i=0;i!=256;++i) for(int j=i;j>=0;--j) p[i]+=per[j]; for(int i=0;i!=in.rows;++i) for(int j=0;j!=in.cols;++j) in.at<uchar>(i,j)=uchar(255*p[in.at<uchar>(i,j)]);
這個方法的效果,和OpenCV提供的函數的效果差異不大。這個方法能夠明顯的提高圖像的對比度,如圖所示
這是原圖轉灰度以後的圖像,咱們只能依稀看到這是個什麼東西,對比度實在堪憂。讓咱們看一下直方圖均衡化以後的效果:
對比度確實高了很多,這個效果咱們仍是能夠接受的。