圖像直方圖均衡化


1. 直方圖均衡化介紹

自我感覺書上講的很清楚,直接把截圖貼上了。

在進行直方圖均值化的過程如下

讀入圖像
對每個通道分別統計像素值[0,255]出現的次數。
對每個通道分別求像素值[0,255]出現的概率,得到概率直方圖。
對每個通道分別求像素值[0,255]概率的前綴和,得到累計直方圖。
對每個通道根據累計直方圖分別求像素映射函數。
對每個通道完成每個像素點的映射。
輸出直方圖均衡化的圖像。
2.代碼(MATLAB)

 

 1 %直方圖均衡化
 2 I = imread('D:/picture/girl.jpg');
 3 I=rgb2gray(I);%如果某些圖片不是二維灰度圖像要加上這句,否則imhist報錯
 4 [height,width] = size(I);
 5 figure 
 6 subplot (221)
 7 imshow(I);%顯示原始圖像
 8 subplot(222)
 9 imhist(I)%顯示原始圖像直方圖(注釋一)
10 
11 %進行像素灰度統計
12 NumPixel = zeros(1,256);%統計各灰度數目,共256個灰度級
13 for i = 1:height
14     for j = 1:width
15         NumPixel (I(i,j)+1)=NumPixel(I(i,j)+1)+1;%對應灰度值像素點數量增加一9(注釋二)
16     end
17 end
18 %計算灰度分布密度
19 ProbPixel = zeros(1,256);
20 for i =1:256
21     ProbPixel(i) = NumPixel(i)/(height*width*1.0);%該灰度值的像素個數除於總的像素點的個數
22 end
23 %計算累計直方圖分布
24 CumuPixel = zeros(1,256);
25 for i = 1:256;
26     if i == 1
27         CumuPixel(i) = ProbPixel(i);
28     else
29         CumuPixel(i) = CumuPixel(i-1)+ProbPixel(i);%進行累加
30     end
31 end
32 %累計分布取整
33 
34 CumuPixel = uint8(256* CumuPixel);%也就是原來圖像的灰度級根據累加概率的值變成了新的灰度級(注釋三)
35 %對灰度值進行映射(均衡化)
36 for k =1:height
37     for l =1:width
38         I(k,l)= CumuPixel(I(k,l)+1);%映射,加一的目的是使下標從一開始
39     end  
40 end
41 subplot(223)
42 imshow(I)%顯示原始圖像
43 subplot(224)
44 imhist(I)%顯示原始圖像直方圖

 

運行結果如下

注:直方圖x軸是圖像的灰度值,y軸是在該灰度值的像素的個數

分析:觀察圖片我們發現對於原始圖片整體顏色偏白,對比度不強,直方圖分布偏於右邊。直方化后的圖片整體顏色加深,灰度增強,頭發沒有原來那么偏白了,直方圖整體分布開始偏左且更均勻化,圖片整體對比度增強。

3注釋

注釋一

imhist()主要用於計算圖像灰度值的直方圖統計;

第一次使用時出現的錯誤:

 

Error using ==> iptcheckinput Function IMHIST expected its first input, I or X, to be two-dimensional.

 

輸入的圖像必須是二維的圖像,當輸入的圖像是三維的時候,可現轉換,轉換代碼:

 

I=imread('nameofupicture.tif');

 

I=rgb2gray(I);
imhist(I);
imhist()的應用:
具體用法: 
imhist( i );直接顯示圖像i的灰度直方圖; 
imhist(i,n)n為指定灰度級顯示直方圖; 
[count, x] = imhist( i ) 獲取直方圖信息,count為每一級灰度像素個數,x為灰度級,x也可以在imhist(i,x)中指定,可以通過stem(x,count)畫相應直方圖;  
如代碼
 1 i = imread('D:/picture/ZiXia.jpg');
 2 i=rgb2gray(i);
 3 imshow(i);
 4 figure;
 5 imhist(i);
 6 figure;
 7 imhist(i,32);
 8 figure;
 9 [count,x] = imhist(i,32);
10 stem(x,count);
View Code

 

 

注釋二

 NumPixel(I(i,j) + 1) --------這個表示的是什么呢?---a NumPixel(I(i,j) + 1) + 1------這個表示像素點的灰度級加1---b I(i,j)-----表示(i,j)點的灰度值 a 處灰度值加1是代碼中灰度值得范圍的[1,256],不是[0,255] b 處為對灰度值相同的像素做統計加1,可以將NumPixel( I(i,j) + 1)看做是下標為灰度值,數組元素值為對應下標(灰度值)統計像素的個數 比如統計出來的灰度值為23的像素個數為4個,那么代碼中的表現形式是:NumPixel( 22 + 1) = 4.

注釋三

 比如原始圖像的灰度值為30的像素個數在新圖像里面就變為原始圖像灰度值小於等於30的像素個數之和作為新圖像像素值為30的像素個數。依次類推。


免責聲明!

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



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