一,什么是直方图(Histogram)
假设有一个
7
∗
14
7*14
7∗14 的图像矩阵,像素范围在 0 ~ 20 共 21个灰度等级,统计各个像素出现的次数以及直方图。如上图。
在分析图像,物体和视频的时候,我们经常用直方图来表达我们关注的信息。直方图可以用来表达很多不同的信息,例如:物体的颜色分布,物体的边缘梯度模板或是以概率分布的形式表达对当前物体位置的估计。
直方图在计算机视觉中应用广泛,例如:通过判断帧与帧之间边缘和颜色的统计量是否出现巨大便变化,来检测视频中场景的变换。
图像直方图: 是指对整个图像在灰度范围内的像素值 (0 ~ 255) 统计出现的频率次数,据此生成的直方图,称为图像直方图。直方图反应了图像灰度的分布情况。是图像的统计学特征。
官方图例:
什么是直方图均衡化?
- 这是一种改善图像对比度的方法,以拉伸强度范围。
- 为了使它更清晰,从上面的图像中,您可以看到像素似乎聚集在可用强度范围的中间。直方图均衡化的作用是扩展这个范围。请看下图:绿色圆圈表示像素值低密度的区域。应用均衡后,我们得到了一个柱状图,如图中所示。最终的图像如图所示。
如何均衡化?
通过像素重映射,我们可以将图像的灰度分布从一个分布映射到另一个分布,然后再得到映射后的像素值即可。均衡意味着将一个分布(给定的直方图)映射到另一个分布(更广泛和更均匀的强度值分布),因此强度值分布在整个范围内对比度提高了。
H
′
(
i
)
=
∑
0
≤
j
<
i
H
(
j
)
H'(i)=\sum_{0≤j<i} H(j)
H′(i)=0≤j<i∑H(j)
e
q
u
a
l
i
z
e
d
(
x
,
y
)
=
H
′
(
s
r
c
(
x
,
y
)
)
equalized(x,y)=H′(src(x,y))
equalized(x,y)=H′(src(x,y))
二 代码演示:
/// <summary>
/// 直方图均衡化
/// </summary>
/// <param name="path"></param>
private static void HistogramEqualization(string path)
{
using (Mat src = new Mat(path, ImreadModes.AnyColor | ImreadModes.AnyDepth))
using (Mat dst = new Mat())
{
//1:转为灰度图 但通道 8 bit (必须)
Cv2.CvtColor(src, dst, ColorConversionCodes.BGR2GRAY);
//直方图均衡化
Cv2.EqualizeHist(dst, dst);
using (new Window("SRC", WindowMode.AutoSize, src))
using (new Window("DST", WindowMode.AutoSize, dst))
{
Cv2.WaitKey(0);
}
}
}