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


一、直方圖均衡化數學推導

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

對於連續函數而言,假設其變換函數為    

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

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

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

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

把 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的對應像素得到。與連續形式不同,一般不能證明離散變換能產生均勻概率密度函數的離散值(為均勻直方圖)。但是不論怎樣,可以很容易地看出,上式的應用有展開輸入圖像直方圖的一般趨勢,以至於直方圖均衡化過的圖像灰度級能跨越更大的范圍。至此,便給出了整個的證明過程。

二、直方圖均衡化的一般實現過程:

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

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

(3)計算累積分布函數

                             

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

        

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

               

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

三、程序說明及代碼

      為驗證對圖片進行直方均衡化的處理效果,編寫代碼對以上推導進行驗證。使用的軟件是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是另外的一副處理圖片:

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM