天天看點

數字圖像處理學習(一):直方圖均衡化灰階直方圖均衡化

灰階直方圖

  • 定義:周遊圖像上的每一個像素點,并根據事先确定的灰階區間,統計每一個灰階區間的像素點數量,即為灰階直方圖。
  • 意義:清晰的圖檔一般灰階直方圖會均勻分布,而那些像素點聚集在某個區域的圖像往往會過暗或過亮。直方圖均衡化的作用就在于使直方圖趨向于均衡分布。

均衡化

1. 數學計算

(1)計算直方圖每個方柱的百分率

(2)設灰階等級分為N級->計算百分率乘上(N-1)->進行累加->四舍五入将累加結果映射到新的灰階等級上->得到規則g

(3)将規則g應用到圖像中,将圖像的灰階值映射到新的值,得到新的圖像,即為均衡化圖像。

2.matlab源碼實作

直方圖均衡化實作函數

% 高斯低通濾波器
% img 傳入圖像
% N_size 定義的模闆大小,需為奇數值
% sigma 标準差
function H = GaussianLowpass(img, N_size, sigma)

% 定義圖像長寬    
N_row = N_size;
N_col = N_size;

% 高斯濾波器模闆
G_ry = zeros(N_row, N_col);

% 求圖像中心點
center = (N_size + 1) / 2;
    
% 求解模闆
for i=1 : N_row
    for j=1 : N_col
        distance_s = double((i-center-1)^2 + (j-center-1)^2);
        G_ry(i,j)=exp((-1) * distance_s/(2*sigma^2))/(2*pi*(sigma^2));
    end
end

% 圖像濾波
H = imfilter(img,G_ry);

end
           

主函數

% 讀入圖像
p = imread("photo.jpeg");      

% 獲得輸入圖像尺寸
[M,N,K] = size(p);    
if(K>1)
    % 将RGB 圖像或顔色圖轉換為灰階圖
    p = rgb2gray(p);  
end

% 求直方圖
hist_0 = GetInhist(p,256)';  

% 求灰階分布機率
hist_1 = hist_0/(M*N);       

% 求原圖灰階累計分布 
hp0 = cumsum(hist_1);   

 % 求關于原圖的映射
hp1 = round(hp0*255);     
G = zeros(M, N);
               
% 求出每一個像素點的灰階值F(i,j),賦給新圖像的對應像素值G(i,j)
for i=1:M
    for j=1:N
        GrayScale = p(i,j);   % 原圖灰階值
        NewGrayScale = hp1(GrayScale+1);
        G(i,j) = NewGrayScale;
    end
end
% 将計算得到的新圖像矩陣中所有點的灰階值由double轉換為uint8,輸出圖像
figure,imshow(uint8(p));title('原圖');
figure,imshow(uint8(G));title('直方圖均衡化後的圖像');
           

3.效果展示

數字圖像處理學習(一):直方圖均衡化灰階直方圖均衡化

繼續閱讀