图像直方图
非归一化直方图:
归一化直方图:
计算直方图与一些函数相关:
1 | void calcHist( const Mat* images, |
参数如下:
-
images:源数组指针,它们都应该具有相同的深度,CV_8U, CV_16U或CV_32F,以及相同的大小。它们中的每一个都可以有任意数量的通道。
-
nimages:源图像的数量。
-
channels:需要统计直方图的第几通道。通道的数量必须与直方图的维度相匹配。第一个数组通道的编号从0到images[0].channels()-1,第二个数组通道的编号从images[0].channels()到images[0].channels() + images[1].channels()-1,以此类推。
-
mask:掩码。选择感兴趣区域,选定后只能对该区域进行操作。
-
hist:直方图计算的输出值。
-
dims:输出直方图的维度(由channels指定)。
-
histSize:直方图中每个dims维度需要分成多少个区间(直方图竖条的个数)。
-
ranges:统计像素值的区间。
-
uniform=true:是否对得到的直方图进行归一化处理。
-
accumulate=false:在多个图像时是否累计计算像素值的个数。
获取图像的直方图代码:
1 |
|
效果展示:
直方图均衡化
通过均衡化处理可以使得图像的直方图分布变得较广较平均。
经过公式:
其中,是变换后的灰度级,是灰度级为的直方图值。
涉及一个函数:
1 | void equalizeHist( InputArray src, OutputArray dst ) |
该函数参数十分简单,只有输入图像矩阵和输出图像矩阵,即可进行图像直方图的均衡化。
代码:
1 |
|
效果展示:
直方图匹配
将需要处理的图像匹配另一幅直方图形状。
由于直方图均衡化映射函数T为单调递增,即变换后的直方图可以经过逆变换回到原直方图。
得到直方图匹配的步骤:
-
计算输入图像的直方图 ,并进行直方图均衡化,得到均衡化后的灰度 。
-
根据公式计算 并存储。
-
对 的每个值,都找到 对应的值,使得 最接近 ,并存储从s到z的映射。
-
从步骤3中找到映射,将 的值映射到直方图指定图像中值为 的对应像素,形成直方图。
涉及映射Look up Table(LUT)函数:
1 | void LUT(InputArray src, InputArray lut, OutputArray dst) |
参数如下:
-
src:表示输入图像。
-
lut:表示查找表。
-
dst:表示输出图像。
代码:white.jpg为纯白图像
1 |
|
效果展示: