直方圖均衡化
算法分析
-
對原圖像每個通道統計0-255的灰度級概率
-
求原圖像每個通道累積概率分布
-
根據累積概率直方圖分別對每個通道(K)求每個像素點的映射
p(k, i) = p(k, i) * 255
function outputimg = myhisteq( A )
% 直方圖均衡化
% 參數A是讀入的圖像矩陣
% outputimg是經過直方圖均衡化的圖像
[H,W,K] = size(A);
P = zeros(K,256); %用於統計各個通道灰度級概率的行向量
%統計每個通道0-255灰度級的概率
for k = 1:K
for v = 0:255
P(k,v + 1) = length(find(A(:,:,k) == v)) / (H * W);
end
end
%求累積概率分布
for k = 1 : K
for i = 2 : 256
P(k, i) = P(k, i - 1) + P(k, i);
end
end
%映射到0-255
for k = 1: K
P(k,:) = round(P(k,:) * 255);
end
outputimg = zeros(H,W,K);
%對新圖像每一個像素點映射
for k = 1:K
for i = 1:H
for j = 1 :W
outputimg(i,j,k) = P(k, A(i, j, k) + 1);
end
end
end
outputimg = uint8(outputimg);
end
實驗結果
%調用示例:
A = imread('lena.png');
B = myhisteq(A);
subplot(1,2,1),imshow(A),title('原圖');
ubplot(1,2,2),imshow(B),title('直方圖均衡');
實驗分析
- 第一步統計原圖中每個灰度級出現的概率,這里注意計數數組下標是從1-256,但是灰度值是從0-255
for k = 1:K
for v = 0:255
P(k,v + 1) = length(find(A(:,:,k) == v)) / (H * W); %這里是v+1
end
end
這里調用了Matlab中自帶的find和length函數,另外也可以使用以下語句分兩步實現,先統計灰度級的頻數,再求概率
% 統計每個像素值出現次數
count = zeros(1, 256);
for i = 1 : R
for j = 1 : C
%f(i,j)中的像素值是從0-255,數組下標是從1-256
count(1, fx(i, j) + 1) = count(1, fx(i, j) + 1) + 1;
end
end
% 統計每個像素值出現的概率, 得到概率直方圖
for i = 1 : 256
T(1, i) = count(1, i) / (R * C);
end
-
求完累積概率分布,將概率映射到0-255灰度級,這樣可以使灰度值范圍比較窄的像素點,占據到整個圖像所允許范圍
-
直方圖均衡化的目的:通過使得圖像的灰度級更加均勻,反映在圖像上使得相鄰的像素之間的差別增大,從而達到增大圖像對比度的效果