空间域图像增强之直方图均衡的python代码实现——冈萨雷斯数字图像处理

原理

直方图:

图像的直方图是一个图像中像素强度值分布的图表。

对于灰度图像,直方图展示了每个灰度级出现的频率。

直方图均衡步骤:

计算累积分布函数(CDF):首先,计算图像的直方图,然后基于这个直方图生成累积分布函数。CDF是每个强度值及其以下强度值出现频率的累加。

归一化CDF:将CDF归一化到[0, 255](对于8位图像)的范围内,以便它可以映射到标准的灰度级。

映射新的强度值:使用归一化的CDF来映射每个像素的新强度值。

效果:

直方图均衡后,图像的直方图将更加均匀分布。

这通常会增加图像的对比度,特别是在图像的原始直方图中占主导地位的区域。

应用

直方图均衡广泛应用于医学图像处理、卫星图像增强、以及其他需要改善图像对比度的场景。虽然它是一个强大的工具,但在某些情况下,如包含非常高或非常低的灰度级集中的图像,它可能不会产生理想的结果。在这些情况下,可能需要采用更为复杂的方法,如自适应直方图均衡。

python代码,实现如下图所示的结果:

提示

用cv2.calcHist函数计算图像的直方图,调用该函数的示例代码如:hist = cv2.calcHist([img], [0], None, [256], [0, 255])。之后可以用cv2.normalize函数将直方图归一化,调用该函数的示例代码如:cv2.normalize(hist, hist)。最后可以用函数cv2.equalizeHist对图像执行直方图均衡化操作,调用该函数的示例代码如:img_equ = cv2.equalizeHist(img)。对暗、亮、低对比度、高对比度四种图像分别做直方图均衡化并观察前后的直方图。注意,plt.imshow会自动扩展灰度图的值域范围,所以为了正确显示前三种视觉效果不佳的图像,需要在imshow时加上参数vmin和vmax,如:axs[i, j].imshow(img, vmin=0, vmax=255, cmap='gray')。直方图用plot而非imshow显示。

代码实现

python 复制代码
import cv2
import numpy as np
from matplotlib import pyplot as plt

img_dark = cv2.imread('Fig0316(4).tif', 0)
img_light = cv2.imread('Fig0316(1).tif', 0)
img_low_con = cv2.imread('Fig0316(2).tif', 0)
img_high_con = cv2.imread('Fig0316(3).tif', 0)
img_ori_list = [img_dark, img_light, img_low_con, img_high_con]
img_list = []
hist_list = []

for img in img_ori_list:
    img_list.append(img)
    hist = cv2.calcHist([img], [0], None, [256], [0, 255])
    cv2.normalize(hist, hist)
    hist_list.append(hist)
    img_equ = cv2.equalizeHist(img)
    img_list.append(img_equ)
    hist_equ = cv2.calcHist([img_equ], [0], None, [256], [0, 255])
    cv2.normalize(hist_equ, hist_equ)
    hist_list.append(hist_equ)

_, axs = plt.subplots(4, 4)

for i in range(4):
    for j in range(2):
        axs[i, j*2].imshow(img_list[i*2+j], vmin=0, vmax=255, cmap='gray')
        axs[i, j*2].axis('off')
        axs[i, j*2+1].plot(hist_list[i * 2 + j])

plt.savefig('hist.jpg')
plt.show()

结果展示

总结

直方图均衡化是图像处理领域中利用图像直方图对对比度进行调整的方法。通过这种方法,亮度可以更好地在直方图上分布。这样就可以用于增强局部的对比度而不影响整体的对比度,直方图均衡化通过有效地扩展常用的亮度来实现这种功能。

直方图均衡化通常用来增加许多图像的全局对比度,尤其是当图像的有用数据的对比度相当接近的时候。通过这种方法,亮度可以更好地在直方图上分布。这样就可以用于增强局部的对比度而不影响整体的对比度,直方图均衡化通过有效地扩展常用的亮度来实现这种功能。这种方法对于背景和前景都太亮或者太暗的图像非常有用,这种方法尤其是可以带来X光图像中更好的骨骼结构显示以及曝光过度或者曝光不足照片中更好的细节。这种方法的一个主要优势是它是一个相当直观的技术并且是可逆操作,如果已知均衡化函数,那么就可以恢复原始的直方图,并且计算量也不大。这种方法的一个缺点是它对处理的数据不加选择,它可能会增加背景噪声的对比度并且降低有用信号的对比度。直方图均衡技术将原始图像的灰度直方图从比较集中的某个灰度区间变成在全部灰度范围内的均匀分布, 由于其算法简单, 无需借助外来因素的参数设置,可以自成系统的运行, 有效地增强图像对比度, 是一种常用的图像增强方法. 一直以来, 直方图均衡技术受到各个领域的重视, 比如在消费类电子产品邻域, 在均衡图像的同时希望保持图像的亮度信息。

相关推荐
爱补鱼的猫猫18 分钟前
Pytorch知识点2
人工智能·pytorch·python
deephub18 分钟前
提升模型泛化能力:PyTorch的L1、L2、ElasticNet正则化技术深度解析与代码实现
人工智能·pytorch·python·深度学习·机器学习·正则化
weixin_4224564425 分钟前
第N1周:one-hot编码案例
python
Python私教32 分钟前
字节跳动开源图标库:2000+图标一键换肤的魔法
python·开源
何双新34 分钟前
第2讲、Odoo深度介绍:开源ERP的领先者
python·开源
Hero_HL1 小时前
Towards Open World Object Detection概述(论文)
人工智能·目标检测·计算机视觉
2301_805054561 小时前
Python训练营打卡Day46(2025.6.6)
开发语言·python
东皇太星1 小时前
SIFT算法详细原理与应用
图像处理·算法·计算机视觉
曹勖之1 小时前
撰写脚本,通过发布/joint_states话题改变机器人在Rviz中的关节角度
开发语言·python·机器人·ros2
audyxiao0011 小时前
计算机视觉顶刊《International Journal of Computer Vision》2025年5月前沿热点可视化分析
图像处理·人工智能·opencv·目标检测·计算机视觉·大模型·视觉检测