此处为方便理解,不使用MATLAB中自带的histeq,手写代码了解内在原理。
原始彩色图片如下:
均衡化后的图像如下:
从累计分布函数的图像可以明显看出,均衡化只需要用一次即可,第二次几乎没有作用,因为均衡化的累计分布函数已经是一条斜率为1
的函数,表明其函数已经服从均匀分布
~!
完整MATLAB代码如下:
clc
clear
%% 1.图片预处理
L = 256; % 划分的灰度级,一般也默认为256
img = imread('西西弗.jpg'); % 读图
img_gray = img(:,:,1); % 将3通道彩色图片转换为1通道灰度图像
%% 2.计算每个灰度级的概率分布P(离散值)和累计分布S
N = imhist(img_gray); % 直方图函数默认划分256个灰度级
for i = 1:size(N)
P(i) = N(i)/sum(N);
if i == 1
S(1) = P(1);
else
S(i) = S(i-1) + P(i);
end
end
%% 3.将累计分布S映射回R,得到均衡化后的R
r = round((L-1).*S+0.5);
%% 4.根据均衡化后的R,生成均衡化后的灰度图像
img_equal = img_gray;
for i = 1:size(img_equal(:))
value = img_equal(i);
if value == 0 % 灰度值value∈[0,255],但matlab中索引从1开始
img_equal(i) = 1;
else
img_equal(i) = r(value);
end
end
%% 5.绘图
figure('NumberTitle', 'on', 'Name', '原始彩色图片'),imshow(img)
figure('NumberTitle', 'on', 'Name', '原始灰度图片'),imshow(img_gray)
figure('NumberTitle', 'on', 'Name', '均衡化后的灰度图片'),imshow(img_equal)
figure
subplot(2,1,1);imhist(img_gray,L),title('1.原始灰度图直方图'); % 划分为L个灰度级
subplot(2,1,2);imhist(img_equal,L),title('2.均衡化后的灰度图片直方图'); % 划分为L个灰度级
figure('NumberTitle', 'on', 'Name', '累积分布函数'),plot(1:256,S)
axis([0 256 0 1]) % X象限∈[0,255],Y∈[0,1]
【参考文献】:
[1] 直方图均衡化计算过程.
[2] 直方图均衡(不用histeq)与直方图规定化.
[3] 直方图均衡化过程(例题).
[4] 直方图规定化计算过程.