直方图均衡化
算法分析
-
对原图像每个通道统计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灰度级,这样可以使灰度值范围比较窄的像素点,占据到整个图像所允许范围
-
直方图均衡化的目的:通过使得图像的灰度级更加均匀,反映在图像上使得相邻的像素之间的差别增大,从而达到增大图像对比度的效果