当前位置: 首页 > news >正文

图像处理中的直方图均衡化:原理与实现

目录

一、直方图是什么?

二、绘制直方图

代码示例

运行结果

三、直方图均衡化

1. 全局直方图均衡化

代码示例

运行结果

四、自适应直方图均衡化

1. 对比度受限的自适应直方图均衡化(CLAHE)

代码示例

运行结果

五、总结


在图像处理中,直方图均衡化是一种常用的图像增强技术,它可以帮助我们改善图像的对比度和亮度,使图像的细节更加清晰。本文将详细介绍直方图均衡化的原理和实现方法,并通过代码示例进行说明。

一、直方图是什么?

直方图是一种统计工具,用于表示图像中像素值的分布情况。具体来说,直方图的横坐标是像素值(从 0 到 255),纵坐标是每个像素值出现的频率(即像素数量)。通过直方图,我们可以直观地了解图像的亮度分布情况。

例如,如果一幅图像的直方图集中在左侧(低灰度值区域),说明图像整体偏暗;如果集中在右侧(高灰度值区域),说明图像整体偏亮。

二、绘制直方图

在 OpenCV 中,可以使用 cv2.calcHist() 函数来计算图像的直方图。这个函数会返回一个数组,表示每个灰度值的像素数量。

代码示例

以下是一个绘制直方图的函数:

import cv2
import numpy as npdef show_bins(img2):# 计算直方图bins = cv2.calcHist([img2], [0], None, [256], [0, 256])print(bins)# 获取直方图的最小值和最大值min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(bins)print(min_val, max_val, min_loc, max_loc)# 创建一个空白图像用于绘制直方图img_bins = np.zeros((512, 512, 3), dtype=np.uint8)dm = 450 / max_val  # 缩放比例# 绘制直方图for index, el in enumerate(bins):cv2.line(img_bins, (index + 100, 490), (index + 100, int(490 - el[0] * dm)), (0, 0, 255), 2)cv2.imshow("img_bins", img_bins)cv2.waitKey(0)return img_bins

运行结果

运行上述代码后,你会看到一个窗口显示了图像的直方图。横坐标是像素值,纵坐标是每个像素值的频率。

三、直方图均衡化

直方图均衡化是一种改善图像对比度的技术。它的目标是将图像的直方图分布调整为均匀分布,从而使图像的亮度和对比度更加均衡。

1. 全局直方图均衡化

全局直方图均衡化是对整个图像进行均衡化处理。它通过重新映射像素值,使图像的直方图分布更加均匀。

在 OpenCV 中,可以使用 cv2.equalizeHist() 函数来实现全局直方图均衡化。

代码示例

def test002():# 读取图像img = cv2.imread("./zhifang.png")img2 = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 绘制原始图像的直方图bins_img = show_bins(img2)cv2.imshow("bins_img", bins_img)cv2.imshow("img2", img2)# 进行直方图均衡化eq_img2 = cv2.equalizeHist(img2)eq_bins_img = show_bins(eq_img2)cv2.imshow("eq_bins_img", eq_bins_img)cv2.imshow("eq_img2", eq_img2)cv2.waitKey(0)cv2.destroyAllWindows()

运行结果

运行上述代码后,你会看到均衡化后的图像对比度明显提高,直方图分布也更加均匀。

四、自适应直方图均衡化

全局直方图均衡化虽然可以改善图像的整体对比度,但在某些情况下可能会导致局部细节丢失。为了解决这个问题,可以使用自适应直方图均衡化(AHE)。

自适应直方图均衡化将图像划分为多个小块,对每个小块分别进行直方图均衡化处理。这样可以更好地保留局部细节。

1. 对比度受限的自适应直方图均衡化(CLAHE)

CLAHE 是一种改进的自适应直方图均衡化方法,它通过限制对比度增强的程度,避免了噪声的过度放大。

在 OpenCV 中,可以使用 cv2.createCLAHE() 函数来创建 CLAHE 对象,然后使用 .apply() 方法对图像进行均衡化处理。

代码示例

import cv2
import numpy as npdef test_clahe():# 读取图像img = cv2.imread("./zhifang.png")img2 = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 创建 CLAHE 对象clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8, 8))# 应用 CLAHEclahe_img2 = clahe.apply(img2)# 绘制原始图像和均衡化后的图像cv2.imshow("Original Image", img2)cv2.imshow("CLAHE Image", clahe_img2)cv2.waitKey(0)cv2.destroyAllWindows()

运行结果

运行上述代码后,你会看到 CLAHE 处理后的图像对比度更高,同时局部细节也得到了更好的保留。

五、总结

直方图均衡化是一种非常实用的图像增强技术,可以帮助我们改善图像的对比度和亮度。通过本文的介绍和代码示例,相信你已经对直方图均衡化有了更深入的理解。

  • 全局直方图均衡化:适用于整体对比度较低的图像。

  • 自适应直方图均衡化(CLAHE):适用于局部对比度较低且需要保留细节的图像。

http://www.dtcms.com/a/271566.html

相关文章:

  • 一天两道力扣(3)
  • 减少空间占用的生成模型实战与推理资源消耗量化对比
  • CTFHub————Web[信息泄露(目录遍历、PHPINFO)]
  • Windows Subsystem for Linux (WSL):现代开发的终极跨平台方案
  • 【Modern C++ Part7】_创建对象时使用()和{}的区别
  • 计算机嵌入式基础
  • SpringCache整合SpringBoot使用
  • 洛谷P1044 栈(学习向)
  • Unity Demo-3DFarm详解-其一
  • TCP协议格式与连接释放
  • 智能Agent场景实战指南 Day 8:销售助手Agent开发实战
  • 25春云曦期末考复现
  • “上下文工程”领域的部分参考资料
  • vue中v-for与v-if的优先级
  • 在已有 Nexus3 的基础上搭建 Docker 私有镜像仓库
  • 如何降低AIGC的有效策略是什么?降AIGC工具的创新与应用前景
  • 如何识别SQL Server中需要添加索引的查询
  • 3 STM32单片机-delay延时驱动
  • langchain从入门到精通(四十)——函数调用技巧与流程
  • 什么是公链?
  • 如何通过配置gitee实现Claude Code的版本管理
  • huggingface 笔记: Trainer
  • 期权盘位是什么意思?
  • 一级缓存与二级缓存深度剖析:作用域、配置与同步方案全解析
  • Unreal Engine 自动设置图像
  • 基于OpenCV的实时人脸检测系统实现指南 ——Python+Haar级联分类器从环境搭建到完整部署
  • 【PTA数据结构 | C语言版】线性表循环右移
  • AI进化论03:达特茅斯会议——AI的“开宗立派”大会
  • 【王阳明代数讲义】心气微积分西方体系汇流历史考述
  • Agent AI(1):多模态交互智能中的背景和动机