当前位置: 首页 > 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.lryc.cn/news/583676.html

相关文章:

  • uniapp中使用uView-plus踩坑记录
  • 18-C#改变形参内容
  • 【linux】ssh使用-X参数后报错:X11 forwarding request failed on channel 0
  • Windows Subsystem for Linux (WSL):现代开发的终极跨平台方案
  • Ubuntu重装系统后ssh连接不上(遇到 ​​“Unit ssh.service not found“​​ 错误)
  • ServBay Windows 1.2.0 更新!新增 PHP 设置与 Ollama 支持
  • SpringGateway网关增加https证书验证
  • rt thread studio 和 KEIL对于使用rt thread 的中间件和组件,哪个更方便
  • 蛋白质序列-kappa参数计算算法解读
  • WPF使用WebBrowser 解决href标签target=_blank在浏览器窗口打开新链接而非窗体内部打开的问题
  • 暑假算法日记第五天
  • 【牛客刷题】小欧的选数乘积
  • 工程改Mvvm
  • c++学习-类中类成员变量的创建和释放顺序2-资源new出来的对象未被手动delete
  • Python通关秘籍之基础教程(一)
  • Vue 中mounted 生命周期钩子的执行时机和 v-for 的渲染顺序
  • 深度学习遇到的问题
  • 射频信号(大宽高比)时频图目标检测anchors配置
  • 基于DeepSeek构建的openGauss AI智能优化助手:数据库性能提升新利器
  • vscode 防止linux索引爆红
  • AI智能体记忆架构的革命:LangGraph中的分层记忆系统实现
  • vue3面试题(个人笔记)
  • Flutter基础(前端教程⑧-数据模型)
  • vue快速上手
  • 设计模式(行为型)-责任链模式
  • ARM单片机OTA解析(一)
  • whitt算法之特征向量的尺度
  • 数据结构之位图和布隆过滤器
  • 详解CAN总线的位填充机制
  • 数据结构——深度优先搜索与广度优先搜索的实现