直方图规定化是一种将一个图像的灰度级分布转换为另一个具有期望灰度级分布的方法。在数字图像处理中,直方图规定化是一种重要的技术,被广泛用于图像增强、色彩校正、图像匹配等领域。本文将以直方图规定化的例题为引子,从多个角度对其进行分析。
首先,我们来看一个实际的例题。假设我们有两个灰度级分布不同的图像,如何将它们的灰度级分布进行匹配?下面是两张图像及它们的灰度直方图:


可以看出,这两张图像的灰度级分布差异较大。我们可以通过直方图规定化的方法,将这两张图像的灰度级分布匹配起来。
直方图规定化的基本思想是:对于给定的目标灰度级分布,将源图像中的每个灰度级映射到另一个灰度级,使得映射后的灰度级分布与目标分布一致。换言之,我们需要找到两个灰度级分布之间的映射函数。
这里介绍一种常用的映射函数:累计分布函数(CDF)。CDF表示每个灰度级的像素点在灰度级分布中所占的比例。通过计算源图像和目标灰度级分布的CDF,我们可以找到它们之间的映射函数。具体做法如下:
1. 获取源图像和目标灰度级分布的CDF。
2. 循环遍历源图像中的每个像素,将其灰度级映射到目标灰度级分布中。
3. 通过查找目标CDF中最接近的灰度级,确定该像素所映射到的灰度级。
下面是代码实现及结果:
```python
import numpy as np
import cv2
# 加载源图像和目标灰度级分布
src_image = cv2.imread('src_image.jpg', cv2.IMREAD_GRAYSCALE)
target_hist = np.load('target_hist.npy')
# 计算源图像和目标灰度级分布的CDF
src_hist, _ = np.histogram(src_image.ravel(), 256, [0, 256])
src_cdf = np.cumsum(src_hist)
src_cdf = (src_cdf - src_cdf.min()) * 255 / (src_cdf.max() - src_cdf.min())
target_cdf = np.cumsum(target_hist)
target_cdf = (target_cdf - target_cdf.min()) * 255 / (target_cdf.max() - target_cdf.min())
# 映射
dst_image = np.interp(src_image.ravel(), src_cdf, target_cdf).astype(np.uint8)
dst_image = dst_image.reshape(src_image.shape)
# 显示结果
cv2.imshow('Source Image', src_image)
cv2.imshow('Target Image', target_image)
cv2.imshow('Destination Image', dst_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
通过直方图规定化的方法,我们成功将两张图像的灰度级分布匹配起来。下图为规定化后的结果:

除了上述例题中的灰度级分布匹配,直方图规定化还可以应用于以下场景:
1. 图像增强:如果一张图像的对比度较低,我们可以通过将其灰度级分布进行均匀化来增强图像的对比度。
2. 图像匹配:在计算机视觉和图像处理领域,直方图规定化可以用于对不同图像的特征进行匹配。例如,在人脸识别中,可以使用直方图规定化来匹配不同人脸的灰度级分布。
3. 色彩校正:直方图规定化可以用于调整图像的色彩平衡,使得不同图像之间具有相似的色彩表现。
微信扫一扫,领取最新备考资料