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

相关推荐
Cachel wood几秒前
python round四舍五入和decimal库精确四舍五入
java·linux·前端·数据库·vue.js·python·前端框架
終不似少年遊*6 分钟前
pyecharts
python·信息可视化·数据分析·学习笔记·pyecharts·使用技巧
Python之栈7 分钟前
【无标题】
数据库·python·mysql
袁袁袁袁满23 分钟前
100天精通Python(爬虫篇)——第113天:‌爬虫基础模块之urllib详细教程大全
开发语言·爬虫·python·网络爬虫·爬虫实战·urllib·urllib模块教程
老大白菜1 小时前
Python 爬虫技术指南
python
古希腊掌管学习的神2 小时前
[搜广推]王树森推荐系统——矩阵补充&最近邻查找
python·算法·机器学习·矩阵
LucianaiB3 小时前
探索CSDN博客数据:使用Python爬虫技术
开发语言·爬虫·python
黑色叉腰丶大魔王3 小时前
基于 MATLAB 的图像增强技术分享
图像处理·人工智能·计算机视觉
PieroPc5 小时前
Python 写的 智慧记 进销存 辅助 程序 导入导出 excel 可打印
开发语言·python·excel
梧桐树04299 小时前
python常用内建模块:collections
python