數位影像處理課,老師布置了7道實驗題,要求是語言不限,但不能調用現成演算法,這些題目有點難度,但題目本身基本涵蓋了這門課中所有重要的內容。為了方便學弟和同道中人完成練習,也為了記錄下方便以後回顧經典的演算法,所以我將一題一題分析。
Histogram Equalization (test images:
fig1.jpg, fig2.jpg)
(a)
Write a computer program for computing the histogram of an image.
(b)
Implement the histogram equalization technique.
(c) Your program must be
general to allow any gray-level image as its input.
As
a minimum, your report should include the original image, a plot of its
histogram, a plot of the histogram-equalization, transformation function, the
enhanced image, and a plot of its histogram.
背景
長條圖均衡化通常用來增加許多映像的全域對比,尤其是當映像的有用資料的對比相當接近的時候。通過這種方法,亮度可以更好地在長條圖上分布。這樣就可以用於增強局部的對比而不影響整體的對比,長條圖均衡化通過有效地擴充常用的亮度來實現這種功能。
這種方法對於背景和前景都太亮或者太暗的映像非常有用,這種方法尤其是可以帶來X光映像中更好的骨骼結構顯示以及曝光過度或者曝光不足照片中更好的細節。這種方法的一個主要優勢是它是一個相當直觀的技術並且是可逆操作,如果已知均衡化函數,那麼就可以恢複原始的長條圖,並且計算量也不大。這種方法的一個缺點是它對處理的資料不加選擇,它可能會增加背景雜訊的對比並且降低有用訊號的對比。
書本中的原理
Matlab實現
sourcePic=imread('fig2.jpg'); %讀取原圖象<br />%以下為了彩色映像<br />%[m,n,o]=size(sourcePic);<br />%grayPic=rgb2gray(sourcePic);<br />grayPic=sourcePic;<br />[m,n]=size(grayPic);<br />subplot(2,2,1);%顯示原圖<br />imshow(grayPic);<br />gp=zeros(1,256); %計算各灰階出現的機率<br />for i=1:256<br />gp(i)=length(find(grayPic==(i-1)))/(m*n);<br />end<br />subplot(2,2,2);%顯示原映像長條圖<br />bar(0:255,gp);<br />title('原映像長條圖');<br />xlabel('灰階值');<br />ylabel('出現機率');<br />newGp=zeros(1,256); %計算新的各灰階出現的機率<br />S1=zeros(1,256);<br />S2=zeros(1,256);<br />tmp=0;<br />for i=1:256<br />tmp=tmp+gp(i);<br />S1(i)=tmp;<br />S2(i)=round(S1(i)*256);<br />end<br />for i=1:256<br />newGp(i)=sum(gp(find(S2==i)));<br />end<br />newGrayPic=grayPic; %填充各像素點新的灰階值<br />for i=1:256<br />newGrayPic(find(grayPic==(i-1)))=S2(i);<br />end<br />subplot(2,2,3);<br />imshow(newGrayPic);<br />subplot(2,2,4);%顯示均衡化後的長條圖<br />bar(0:255,newGp);<br />title('均衡化後的長條圖');<br />xlabel('灰階值');<br />ylabel('出現機率');<br />
效果與示範
fig1.jpg原圖,長條圖均衡化後效果
fig2.jpg原圖,長條圖均衡化後效果
體會
長條圖均衡化主要是利用統計的思想建立原映像與新映像灰階值的關係,最終讓映像的灰階變的均衡。從最終的結果來看第二張圖的效果比較好,而第一張圖雖然對比增加了,但與此同時引出了很多椒鹽雜訊。