写作时间:2020-07-29
目录:
1.前言
2.代码
-2.1 我的详细源代码
-2.2 利用MATLAB自带函数
3.思考
4.总结
正文
1.前言
直方图均衡(Histogram equalization,下文中我简称为HE)是利用直方图分布,计算累加函数,按照累加函数做映射,能够提升图像对比度。
本文我会从每一个小的步骤编写,说明,并给出每一阶段的结果,让你完全搞懂其原理。
直方图均衡示例:
可见,图像对比度得到提高,且能够观察到原图的隐藏的细节。
可见,经过直方图均衡处理后的图像,== 其直方图高度比较一致,比较均衡,所以这也就是“直方图均衡”的命名来源。==
所以,直方图均衡这个名字以处理结果来命名的。
2.代码
2.1 自己写一个
还是那句话,
== 要想搞明白真正原理,尤其你是做图像算法的,还是得自己动手写 ==
代码如下:
%直方图均衡Histogram equalization 源代码
Iin = imread('tire.tif');
[numRows,numCols]=size(Iin);
numBins=2^8;
%直方图统计,概率分布函数pdf(Probability distribution function)
pdf=zeros(1,numBins);
for ii=1:numRows
for jj=1:numCols
pdf(Iin(ii,jj)+1)=pdf(Iin(ii,jj)+1)+1;
end
end
figure()
plot(pdf,'.-');
grid on;
title('直方图统计');
%累加直方图得到,累加分布函数cdf(Cumulative distribution function)
cdf=cumsum(pdf);
cdf=cdf./cdf(end); %归一化处理
figure()
plot(cdf,'.-');
grid on;
title('直方图累加函数计算');
% 根据累加函数映射
Iout=zeros(numRows,numCols);
for ii=1:numRows
for jj=1:numCols
Iout(ii,jj)=255*cdf(Iin(ii,jj)+1);
end
end
% 对比处理前后的图像
figure()
imshow([Iin,Iout]);
title('左:原图 右:处理图')
% 对比处理前后的图像的直方图
figure()
subplot(2,1,1)
imhist(uint8(Iin));
title('原图的直方图 ')
subplot(2,1,2)
imhist(uint8(Iout));
title('处理图的直方图')
2.2 使用Matlab 自带函数histeq
%直方图均衡 Histogram equalization
Iin = imread('tire.tif');
Iout=histeq(Iin);
imshow([Iin,Iout]);
title('左:原图 右:处理图')
3.思考(算法思想)
为什么“累加pdf概率分布函数得到cdf,再根据cdf映射”这种操作,能够提升对比度?
重点! 这里你看懂了,就算差不多理解HE算法的精髓了.
我大概回答下:
统计cdf时候,pdf大的时候,cdf就增长的快,一般情况下pdf大的是主体目标,最终根据cdf映射的时候,分配的灰度值动态范围大。
所以,HE提升了在灰度分布集中区域的动态范围分布,降低了灰度分布较少的动态范围分配,因此有效的提升了关键目标的对比度。是一种“非线性不公平”的映射。
注:
概率分布函数pdf (Probability distribution function)
累加分布函数:cdf (Cumulative distribution function)
4.总结
直方图均衡方法是一种很好的图像对比度提升方法。
HE的缺点:
并不适应所有场景,正如我在第3段所说,对主体目标pdf大的时候表现的好。但是如果主体目标的pdf比较小呢,就会有负面效果,比如会放大噪声,“水洗”效果等。所以需要在其基础上做改进。
THE END~