图形处理 -- 直方图均衡化技术

直方图均衡化技术文档

背景

直方图均衡化是一种常用的图像增强技术,用于提升图像的对比度,使得图像的亮度分布更加均匀,从而改善视觉效果。这种技术尤其适用于亮度不均或对比度较低的图像,通过对像素值进行重新分配,使得图像中的细节更加清晰和显著。

数学步骤

1. 计算灰度级的直方图

假设图像是一个灰度图像,像素值范围为 [ 0 , L − 1 ] [0, L-1] [0,L−1],其中 L L L 是灰度级的总数(例如,8位图像中, L = 256 L = 256 L=256)。首先计算每个灰度值 r k r_k rk 的频率(也称为直方图),表示为 n k n_k nk,其中 k = 0 , 1 , 2 , ... , L − 1 k = 0, 1, 2, \dots, L-1 k=0,1,2,...,L−1。

公式如下:

p r ( r k ) = n k N p_r(r_k) = \frac{n_k}{N} pr(rk)=Nnk

其中, p r ( r k ) p_r(r_k) pr(rk) 表示灰度级 r k r_k rk 的概率, N N N 为图像中像素的总数。

2. 计算累积分布函数(CDF)

计算累积直方图或累积分布函数 c ( r k ) c(r_k) c(rk):

c ( r k ) = ∑ j = 0 k p r ( r j ) c(r_k) = \sum_{j=0}^{k} p_r(r_j) c(rk)=j=0∑kpr(rj)

c ( r k ) c(r_k) c(rk) 表示从灰度值 0 到 r k r_k rk 的累积概率。

3. 进行灰度值映射

将原始图像中每个像素值 r k r_k rk 映射到新的均衡化后的值 s k s_k sk:

s k = ( L − 1 ) ⋅ c ( r k ) s_k = (L - 1) \cdot c(r_k) sk=(L−1)⋅c(rk)

其中, s k s_k sk 是经过均衡化后的像素值,取值范围也是 [ 0 , L − 1 ] [0, L-1] [0,L−1]。

4. 应用映射到图像

将所有像素的原始值 r k r_k rk 通过映射函数替换为新的值 s k s_k sk,得到均衡化后的图像。

公式总结

直方图均衡化的转换函数为:

T ( r k ) = ( L − 1 ) ⋅ ∑ j = 0 k p r ( r j ) T(r_k) = (L - 1) \cdot \sum_{j=0}^{k} p_r(r_j) T(rk)=(L−1)⋅j=0∑kpr(rj)

通过 T ( r k ) T(r_k) T(rk) 的映射,可以得到均衡化后的灰度级。

直方图均衡化的直观理解

直方图均衡化通过重新分配像素值,使得较少出现的像素值占据更多的灰度范围,而频繁出现的像素值占据较小的灰度范围,从而达到增强图像对比度的效果。通过累积分布函数,原始图像的像素值被重新映射,使得在新图像中,像素的分布更加均匀,从而提高对比度,使图像的细节更加明显。

示例代码

以下是使用 Python 和 OpenCV 对图像进行直方图均衡化的代码示例:

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

# 读取灰度图像
image = cv2.imread('example.jpg', 0)

# 使用OpenCV的直方图均衡化函数
equalized_image = cv2.equalizeHist(image)

# 显示原始图像和均衡化后的图像
cv2.imshow('Original Image', image)
cv2.imshow('Equalized Image', equalized_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

小结

  • 直方图均衡化 的核心是重新分配像素值,使得图像亮度的分布更均匀。
  • 通过 累积分布函数(CDF),可以得到每个像素值的映射,从而增强图像对比度。
  • 这种技术在图像光照不均或对比度较低的情况下尤其有用,可以让图像中的细节变得更加明显。
相关推荐
卡奥斯开源社区官方19 分钟前
NVIDIA Blackwell架构深度解析:2080亿晶体管如何重构AI算力规则?
人工智能·重构·架构
百锦再1 小时前
第11章 泛型、trait与生命周期
android·网络·人工智能·python·golang·rust·go
数新网络3 小时前
The Life of a Read/Write Query for Apache Iceberg Tables
人工智能·apache·知识图谱
Yangy_Jiaojiao4 小时前
开源视觉-语言-动作(VLA)机器人项目全景图(截至 2025 年)
人工智能·机器人
gorgeous(๑>؂<๑)4 小时前
【ICLR26匿名投稿】OneTrackerV2:统一多模态目标跟踪的“通才”模型
人工智能·机器学习·计算机视觉·目标跟踪
坠星不坠4 小时前
pycharm如何导入ai大语言模型的api-key
人工智能·语言模型·自然语言处理
周杰伦_Jay4 小时前
【智能体(Agent)技术深度解析】从架构到实现细节,核心是实现“感知环境→处理信息→决策行动→影响环境”的闭环
人工智能·机器学习·微服务·架构·golang·数据挖掘
王哈哈^_^5 小时前
【完整源码+数据集】课堂行为数据集,yolo课堂行为检测数据集 2090 张,学生课堂行为识别数据集,目标检测课堂行为识别系统实战教程
人工智能·算法·yolo·目标检测·计算机视觉·视觉检测·毕业设计
Elastic 中国社区官方博客5 小时前
Observability:适用于 PHP 的 OpenTelemetry:EDOT PHP 加入 OpenTelemetry 项目
大数据·开发语言·人工智能·elasticsearch·搜索引擎·全文检索·php
神仙别闹6 小时前
基于 C++和 Python 实现计算机视觉
c++·python·计算机视觉