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

相关推荐
qZ6bgMe435 分钟前
使用Mixin类简单重构配置模块
网络·python·重构
巧妹儿6 分钟前
AI Agent 实战:MySQL 监控指标查询 Skill|华为云 + 腾讯云双兼容可直接复用
python·mysql·ai·大模型·华为云·腾讯云
ZC跨境爬虫41 分钟前
免费验证码识别:用ddddocr实现Playwright自动化登录
爬虫·python·自动化
数据知道1 小时前
claw-code 源码详细分析:子系统目录地图——几十个顶层包如何用五条轴(会话 / 工具 / 扩展 / 入口 / 桥接)读懂?
服务器·python·ai·claude code
cxr8281 小时前
GPU 加速声场求解器 - 深度扩展
人工智能·python
zaim11 小时前
计算机的错误计算(二百二十六)
java·python·c#·c·错数·mpmath
EmmaXLZHONG1 小时前
Django By Example - 学习笔记
笔记·python·学习·django
ZC跨境爬虫1 小时前
Playwright进阶操作:鼠标拖拽与各类点击实战(含自定义拖拽实例)
前端·爬虫·python·ui
kvo7f2JTy1 小时前
全面解析 Mineru:高效文件解析工具的核心参数详解
python
心静财富之门1 小时前
《前端零基础入门:HTML + CSS + JavaScript 全套速查表(详细版 + 实例)》
前端·javascript·python