### OpenCV与NumPy实现直方图均衡化
在Python中,可以通过OpenCV库轻松实现图像的直方图均衡化。该方法能够有效提升图像对比度,尤其是在处理低对比度或光照不均的场景时表现优异[^3]。
以下是基于OpenCV和NumPy的具体实现方式:
#### 使用OpenCV内置函数`cv2.equalizeHist`
```python
import cv2
import numpy as np
from matplotlib import pyplot as plt
# 加载灰度图像
img = cv2.imread('image_path.jpg', cv2.IMREAD_GRAYSCALE)
# 应用直方图均衡化
equ = cv2.equalizeHist(img)
# 显示原图与均衡化后的图像
plt.subplot(1, 2, 1), plt.title("Original Image"), plt.imshow(img, cmap='gray')
plt.subplot(1, 2, 2), plt.title("Equalized Image"), plt.imshow(equ, cmap='gray')
plt.show()
```
上述代码利用了OpenCV提供的高效API `equalizeHist()` 来完成直方图均衡化操作[^4]。
---
#### 自定义实现直方图均衡化逻辑
如果希望深入了解其实现细节,也可以手动编写代码模拟这一过程。具体步骤如下所示:
```python
def manual_histogram_equalization(image):
# 计算像素频率分布
hist, bins = np.histogram(image.flatten(), 256, [0, 256])
# 归一化累积分布函数 CDF (Cumulative Distribution Function)
cdf = hist.cumsum()
cdf_normalized = cdf * hist.max() / cdf[-1]
# 创建映射表用于更新像素值
lookup_table = np.interp(np.arange(0, 256), bins[:-1], cdf_normalized).astype(np.uint8)
# 返回均衡化后的图像
return lookup_table[image]
# 调用自定义函数
manual_equ = manual_histogram_equalization(img)
# 展示结果
plt.figure(figsize=(10, 5))
plt.subplot(1, 3, 1), plt.title("Original Image"), plt.imshow(img, cmap='gray')
plt.subplot(1, 3, 2), plt.title("Manual Equalized Image"), plt.imshow(manual_equ, cmap='gray')
plt.subplot(1, 3, 3), plt.title("Built-in Equalized Image"), plt.imshow(equ, cmap='gray')
plt.tight_layout()
plt.show()
```
此部分展示了如何通过计算累计概率密度函数(CDF),再将其线性拉伸至整个强度范围来达到均衡化的效果。
---
#### 结合Matplotlib绘制直方图比较
为了直观感受直方图的变化情况,还可以借助Matplotlib工具包进一步可视化数据差异:
```python
hist_original = cv2.calcHist([img], [0], None, [256], [0, 256])
hist_equalized = cv2.calcHist([equ], [0], None, [256], [0, 256])
plt.figure(figsize=(10, 5))
# 原始图像直方图
plt.subplot(1, 2, 1), plt.title("Original Histogram")
plt.bar(range(256), hist_original[:, 0], width=1.0, color="blue")
# 均衡化后图像直方图
plt.subplot(1, 2, 2), plt.title("Equalized Histogram")
plt.bar(range(256), hist_equalized[:, 0], width=1.0, color="green")
plt.tight_layout()
plt.show()
```
以上脚本不仅实现了直方图均衡化功能,还提供了清晰的数据呈现手段以便观察前后变化趋势[^2]。
---