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