接第一篇,第一篇整理了一些經常使用的灰度空間的函數映射變換,和一個基於比特位的Bit-plane slicing.繼續往下整理;java
仍然是基於point的灰度空間處理,直方圖是很是經常使用而有效的技巧。算法
直方圖(Histogram manipulation)能夠很是有效的用於圖像加強,此外,提供了對圖像的統計信息,也能夠用於其餘一些圖像處理,如圖像壓縮和圖像分割。數組
較暗的圖像的直方圖統計成分集中在較低的灰度區間, 明亮圖像的直方圖統計成分集中在較高的灰度空間,低對比度的圖像的直方圖統計成分每每集中在灰度空間的中部,所佔據的灰度區間也比較狹窄。而較好的具備高對比的圖像直方圖成分每每會散步整個灰度空間,並且接近均勻分佈。直方圖均衡化要作的事情,就是把集中與必定區間的直方圖成分均勻散佈到整個灰度空間,使暗圖,亮圖,低對比度圖像成爲高對比度,易於觀測的圖像。函數
直方圖均衡化(Histogram Equalization),打散密集於必定區間的灰度級至整個灰度空間,相似哈希過程:ui
首先考慮一個連續函數,r表示圖像的灰度級,並被正則化到[0,1]區間spa
\( s = T(r) 0<=r<=1\)code
對於原圖的每個灰度級r,產生一個新的灰度級s,函數\(T(r)\)完成這樣的過程,需知足的條件有:blog
1.\(T(r)\)必須在定義域內是一個單值的單調遞增函數;排序
2.\(T(r)\)映射到的新灰度級不能躍遷到定義的灰度空間之外,即\(T(r)\)的值域爲[0,1];索引
r是[0,1]上的隨機變量,能夠用機率密度函數描述r,即\(P_r(r)\) 和\(P_s(s)\)表示r ,s在[0,1]區間上的機率密度,若是已知\(T(r)\)和\(P_r(r)\),由機率論知識,能夠計算出\(P_s(s)\):
\(P_s(s) = P_r(r)\left|\frac{dr}{ds}\right|\)
所以能夠獲得轉換公式,兩邊積分便可:
\(s = T(r) = \int_{0}^{r}P_r(w) dw\)
\(T(r)\)是隨機變量r的CDF累積分佈函數,而且知足做爲轉換函數的兩個條件。
(注:此部分數學推導不是很明白,有一部分證實\(P_s(s)\)機率密度與r無關,呈均勻分佈的證實未理解);
此理論可用到離散圖像的直方圖均衡化,在離散圖像中:
\(P_r(r_k) = \frac{n_k}{n} k = 0,1,2, ... L-1 \)
n是point的總數,\(n_k\)是灰度級爲K的point的數目。由此:
\(s_k = T(r_k) = \sum_{j=0}^{k} P_r(r_j) = \sum_{j=0}^{k} \frac{n_j}{n} k = 0,1,2, ... L -1\)
\(r_k\)是輸入圖像的灰度級, \(s_k\)是對應輸出圖像的灰度級,以上函數完成了同樣一個映射。就是直方圖均衡化過程。
MATLAB中實現用imhist,histeq函數
1 clc; 2 img = imread('D:\MATLAB\image\DIP3E_Original_Images_CH03\Fig0310(b)(washed_out_pollen_image).tif'); 3 himg = imhist(img); 4 imshow(f); 5 himg1 = himg(1:256); 6 horz = 1:256; 7 figure,stem(horz,himg1,'fill') 8 axis([0 255 0 40000]) 9 set(gca,'xtick',[0:10:256]) 10 set(gca,'ytick',[0:2000:40000]) 11 title('origin image histogram') 12 hqimg = histeq(img); 13 figure,imshow(hqimg); 14 hqhist = imhist(hqimg); 15 hqhist1=hqhist(1:256); 16 figure,stem(horz,hqhist1,'fill') 17 axis([0 255 0 40000]) 18 set(gca,'xtick',[0:10:256]) 19 set(gca,'ytick',[0:2000;40000]);
顯示圖:
離散直方圖均衡化的算法實現過程似曾相識,很容易想起一個比較輕量級但在特定狀況很高效的排序算法--鍵索引計數法,鍵索引計數法是一些字符串排序算法的基礎。由於是非基於比較的排序算法,因此打破了比較排序算法的下限\(NlogN\);
注:比較排序法的下限來自於香農的信息論;
鍵索引計數法的java代碼:
1 public class KeySort{ 2 public static sort(int[] a){ 3 int[] count = new int[a.length+1]; 4 int[] aux = new int[a.length]; 5 /*統計頻率*/ 6 for(int i = 0;i < a.length;i++){ 7 count[a[i]+1]++; 8 } 9 /*頻率轉索引*/ 10 for(int j = 0;j<count.length-1;j++){ 11 count[j+1]+=count[j]; 12 } 13 /*回寫*/ 14 for(int k = 0;k<a.length;k++){ 15 aux[count[k]++] = a[k]; 16 } 17 } 18 }
這是一個非原地排序程序,時間複雜度爲\(O(n)\),空間複雜度爲\(O(N)\),主要有三個部分構成,頻率統計,統計過程至關於圖像的直方圖化,接着頻率轉索引,count數組至關於一個索引映射表,數組下標爲原索引,值爲映射索引。最後根據索引表依次安排原數組元素,至關於一個直方圖均衡化過程。
由此,能夠本身寫出離散圖像的直方圖均衡化程序:
MATLAB代碼:
1 clc; 2 img = imread('D:\MATLAB\image\DIP3E_Original_Images_CH03\Fig0310(b)(washed_out_pollen_image).tif'); 3 [x,y] = size(img); 4 imshow(img); 5 Max = max(max(img)); 6 Min = min(min(img)); 7 count = zeros(1,256); 8 for i =1:x 9 for j= 1:y 10 %統計像素點 11 count(img(i,j)+1)=count(img(i,j)+1)+1; 12 end 13 end 14 figure,plot(count); 15 axis([0 255 0 40000]); 16 %直方圖映射函數 17 p = count./(x*y); 18 %figure,plot(p) 19 %axis([0 255 0 1]); 20 for m=1:255 21 p(m+1) = p(m)+p(m+1); 22 end 23 %離散圖像映射 24 imghist = zeros(x,y); 25 for a = 1:x 26 for b = 1:y 27 imghist(a,b)=p(img(a,b)+1)*256; 28 end 29 end 30 imghist = uint8(imghist); 31 figure,imshow(imghist); 32 count2 = zeros(x,y); 33 for i =1:x 34 for j =1:y 35 count2(imghist(i,j)+1)=count2(imghist(i,j)+1)+1; 36 end 37 end 38 figure,plot(count2) 39 axis([0 255 0 40000]);
變換結果
排序的鍵索引技術法和圖像的直方圖均衡化在原理和實現上有很大的類似,只是目的不同而已,第一步統計,第二部頻率轉索引都是相同的,最後一步不一樣,須要多加理解;