圖像處理------直方圖均衡化

1、直方圖均衡化數學推導函數

    直方圖均衡化的整體思想:首先考慮連續函數而且讓變量r表明待加強圖像的灰度級,假設被歸一化到區間[0,1],且r=0表示黑色及r=1表示白色。而後再考慮一個離散公式並容許像素值在區間[0,L-1]內。spa

對於連續函數而言,假設其變換函數爲    3d

              s=T(r),  0=<r<=1    blog

在原始圖像中,對於每個像素值r產生一個灰度值s。其中,變換函數要知足如下條件:圖片

(1)T(r)在區間中爲單值且單調遞增。這是爲了保證其逆函數的存在,而且輸出圖像從黑到白順序增長;數學

(2)當0=<r<=1時,0=<T(r)<=1。這保證輸出灰度級與輸入有一樣的範圍。it

把 s=T(r)的逆函數表示爲   圖像處理

                  

一幅圖像的灰度級可被視爲區間[0,1]的隨機變量。隨機變量的一個最重要的基本描述是其機率密度函數。令分別表明隨機變量r和s的機率密度函數。此處帶有下標的用於表示不一樣的函數。由基本機率理論獲得一個基本結果:若是已知,且知足條件(1),那麼變換變量s的機率密度函數可由如下簡單公式獲得:      變量

                     

所以,變換變量s的機率密度函數由輸人圖像的灰度級機率密度函數和所選擇的變換函數所決定。原理

在圖像處理中一個尤其重要的變換函數: 

               

該被積函數其值爲正,而且函數積分是一個函數曲線下的面積,其內含爲隨機變量r的累積分佈函數,因此它遵照該變換函數是單值單調增長的條件,所以知足條件(1)。一樣地,區間[0,1]也知足條件(2)。其積分過程以下:

             

用這個結果代替dr/ds,代入上式,取機率爲正,獲得:

              

由於是機率密度函數,在這裏能夠得出區間[0,1]之外它的值爲0,可見上式中給出的形式爲均勻機率密度函數。換句話來講,上式給出的變換函數會獲得一個隨機變量,其特徵爲一個均勻機率密度函數,與的函數形式是無關的。總述以上,能夠看出即是一個直方圖均衡化的基本原理,該等式右邊的意義就是隨機變量r的累積分佈函數。這樣便轉化爲了求輸入圖像灰度級的累積分佈函數。

      下面開始討論離散函數。對於離散值,處理的是它函數機率的和,而不是機率密度函數的積分。一幅圖像中灰度級出現的機率近似爲:

                               

其中,n 是圖像中像素的總和,nk是灰度級爲的像素個數,L爲圖像中可能的灰度級總數。式4中變換函數的離散形式爲:

                     

所以,已處理的圖像(即輸出圖像)由經過上式,將輸入圖像中灰度級爲的各像素映射到輸出圖像中灰度級爲sk的對應像素獲得。與連續形式不一樣,通常不能證實離散變換能產生均勻機率密度函數的離散值(爲均勻直方圖)。可是不論怎樣,能夠很容易地看出,上式的應用有展開輸入圖像直方圖的通常趨勢,以致於直方圖均衡化過的圖像灰度級能跨越更大的範圍。至此,便給出了整個的證實過程。

2、直方圖均衡化的通常實現過程:

(1)統計原始輸入圖像各灰度級的像素數目,,其中L爲灰度總級數;

(2)計算原始圖像直方圖,即各灰度級的機率密度,,n爲原始圖像的總像素數目;

(3)計算累積分佈函數

                             

(4)計算最後的輸出灰度級,

        

式中INT[]是取整算符。令gmin=0,gmax=L-1,則計算式簡化爲

               

(5)用fk(原圖像的灰度級函數)和gk的映射關係,修改原圖像的灰度級,得到輸出圖像,其直方圖爲近似均勻分佈。

3、程序說明及代碼

      爲驗證對圖片進行直方均衡化的處理效果,編寫代碼對以上推導進行驗證。使用的軟件是MATLAB,下面是代碼:

clc;

clear all;

img=imread('lena.jpg');

subplot(2,2,1);

imshow(img);                              

title('原圖);

gray_img=rgb2gray(img);                      

 

[m,n]=size(gray_img);                          

pr=zeros(1,256);                        

for i=1:256

     pr(i)=length(find(gray_img==i-1))/(m*n);  

end

subplot(2,2,2);

bar(pr) ;             

title('原圖的直方圖')

S=zeros(1,256);

for i=1:256

     for j=1:i

          S(i)=pr(j)+S(i);              

     end

end

S1=round((S*255)+0.5);                    

for i=1:256

     q(i)=sum(pr(find(S1==i)));         

end

subplot(2,2,4);

bar(q)                 

title('處理後的直方圖')

res_img=gray_img;

for i=1:256

    res_img(find(gray_img==i-1))=S1(i);              

end

subplot(2,2,3);imshow(res_img);

title('均衡化後的圖效果');

 

下圖1是lena.jpg的運行結果圖,圖2是另外的一副處理圖片:

 

相關文章
相關標籤/搜索