本文内容
- 直方图的定义及其特性
- 直方均衡化的及其Python实现
- 图片相似度检测算法及其Python实现
- 直方图反向投影及其Python实现
(所有代码可在我的GitHub找到,传送门:
https://github.com/Panacea1999/image_algorithms/tree/main/histogram_algorithms)
直方图的定义及特性
直方图是对数据分布的一种准确的图形表示,对于连续数据和离散数据都适用。横轴代表数值(连续数据)或其类型(离散数据),纵轴代表样本空间中每一种数据出现的频数。
以彩色图片的灰度直方图为例,首先需要将彩色图片转换为灰度图片。将颜色的灰度分为256个等级,用0~255的整数表示。其中0表示黑色,255表示白色。统计灰色图片中每一种灰度对应的像素点的个数并以直方图的形式绘制,即灰度直方图,如下图所示:
对于彩色图像,在RGB三色通道上分别实现上述过程,即可得到RGB直方图,如下图所示:
在将图片转换为直方图的过程中,像素点的空间信息将被丢失,即对于一张直方图,我们只能得到某个特定颜色颜色的像素点一共有多少个,而无法得知这些像素点的具体位置信息。也就是我们无法通过直方图来反推原始图像。进一步说,直方图具有一对多的特性,举例:
这两张图像具有完全一样的直方图,然而其原始图片并不相同。因此直方图的转换是一个不可逆过程。
此外,直方图能在一定程度上表现图片的质量。对于色彩丰富且对比均衡的图片,其灰度直方图应是较为平均地分布在0~255整个区间。而对于欠曝或者过曝的图像,其灰度直方图将呈现不均匀的分布,甚至被限制在某一个区间。举例:
第一张图片为网络下载的原图的灰度直方图结果,其对比度适中,灰度直方图分布也较为平均。而第二张图片是作者手动降低其对比度后的图片,其灰度直方图表示大量像素点密集地聚集在0~50灰度范围内。
直方图均衡化(Histogram Equalization, HE)及其Python实现
在现实生活中,某些图像受限于拍摄环境的光线、角度及拍摄设备,存在对比度过低的情况。通过上述直方图的性质可知,如果能通过将对比度低的图片的直方图修改为分布均衡的直方图,就可以解决对比度过低的问题,这一过程即直方图均衡化,是图像增强算法的一种(Enhancement Algorithm)。
具体的做法是,首先计算灰度图像的累计分布函数(不需要了解数学原理的同学可以直接跳过这一部分去看Python实现):
c ( f ) = ∑ t = 0 f p f ( t ) = ∑ t = 0 f n t / n , f = 0 , 1 , . . . , L c(f)=\sum_{t=0}^fp_f(t)=\sum_{t=0}^fn_t/n , f=0,1,...,L c(f)=∑t=0fpf(t)=∑t=0fnt/n,f=0,1,...,L
其中 p f ( t ) p_f(t) pf(t)为概率分布函数,t是虚拟变量, n t n_t nt表示所有灰度为t的像素点的数量,n表示所有像素点的总数量,L为图像中出现的灰度级别的数量。
定义 g = T ( f ) g=T(f) g=T(f)为直方图均衡化的点操作过程,其将原图片的 f ( x , y ) f(x,y) f(x,y)映射至输出图像的 g ( x , y ) g(x,y) g(x,y)。有:
g = T ( f ) = r o u n d