直方圖均衡

直方圖這個東西,是個好東西。所謂的直方圖,就是統計這個圖像當中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提供的函數的效果差異不大。這個方法能夠明顯的提高圖像的對比度,如圖所示

這是原圖轉灰度以後的圖像,咱們只能依稀看到這是個什麼東西,對比度實在堪憂。讓咱們看一下直方圖均衡化以後的效果:

對比度確實高了很多,這個效果咱們仍是能夠接受的。

相關文章
相關標籤/搜索