OpenCV实现彩色图像的直方图均衡化

1、直方图均衡化

在OpenCV中,equalizeHist函数用于直方图均衡化(Histogram Equalization)。这是一种图像处理技术,旨在增强图像的对比度,特别是在图像的灰度值集中于某个范围时非常有用。通过调整图像的灰度分布,使得输出图像的灰度值更加均匀地分布在0到255的范围内,从而改善图像的视觉效果。
工作原理

直方图均衡化的基本思想是:

  1. 计算输入图像的直方图:统计每个灰度级出现的次数。
  2. 计算累积分布函数(CDF):对于每个灰度级,计算包括该灰度级在内的所有较低灰度级的像素总数。
  3. 使用CDF映射灰度级:将原始灰度级通过CDF映射到新的灰度级,确保输出图像的灰度值分布更加均匀。

2、OpenCV的直方图均衡化

python 复制代码
dst = cv2.equalizeHist(src)
  • src:输入图像,应为灰度图像。
  • dst:均衡化后的输出图像。

通过,参数的说明可知,这个API仅用于灰度图像,那么,如果想对彩色图像进行直方图均衡化,该怎么处理呢?

3、分通道直方图均衡化方案

顾名思义,把彩色图像的R、G、B三个通道分别进行直方图均衡化处理。python代码如下:

python 复制代码
def ChnEqhist(input):
    '''
    分通道进行直方图均衡化
    '''
    #B通道
    blue = cv.equalizeHist(input[:, :, 0])
    #G通道
    green = cv.equalizeHist(input[:, :, 1])
    #R通道
    red = cv.equalizeHist(input[:, :, 2])
    #通道合成
    result = np.stack((blue, green, red), axis=-1)
    return result

测试效果如下:

可看出,部分玩具的颜色还是整体泛白,存在失真的现象。那么,有没有改进的方案呢?

4、YUV颜色空间的直方图均衡化方案

算法步骤

  1. BGR颜色空间转YUV。
python 复制代码
 yuv = cv.cvtColor(input, cv.COLOR_BGR2YUV_I420)
  1. 单独对Y分量进行直方图均衡化。
python 复制代码
y_chn = yuv[0:height, 0:width]
#对Y分量进行直方图均衡
eq_y_chn = cv.equalizeHist(y_chn)
  1. 计算有分量直方图均衡后灰度值的变化系数 d e l t a delta delta。
python 复制代码
delta = (np.float32(eq_y_chn) / np.float32(y_chn))
  1. 使用 d e l t a delta delta系数对原始RGB空间的灰度进行相乘。
python 复制代码
dst = np.uint8(np.clip(np.multiply(input, delta[:, :, np.newaxis]), 0, 255))

测试图像如下:

5、效果对比和分析

1、在YUV空间进行直方图均衡化,能够减轻颜色失真的现象,避免了整体泛白。

2、也减小了算法的计算量,避免了3个通道的直方图均衡化操作。

相关推荐
hie9889410 分钟前
基于matlab策略迭代和值迭代法的动态规划
算法·动态规划
Coovally AI模型快速验证12 分钟前
SFTrack:面向警务无人机的自适应多目标跟踪算法——突破小尺度高速运动目标的追踪瓶颈
人工智能·神经网络·算法·yolo·计算机视觉·目标跟踪·无人机
Brduino脑机接口技术答疑13 分钟前
脑机新手指南(七):OpenBCI_GUI:从环境搭建到数据可视化(上)
人工智能·算法·脑机接口·新手入门
真的很上进24 分钟前
2025最全TS手写题之partial/Omit/Pick/Exclude/Readonly/Required
java·前端·vue.js·python·算法·react·html5
jndingxin29 分钟前
OPenCV CUDA模块光流处理------利用Nvidia GPU的硬件加速能力来计算光流类cv::cuda::NvidiaHWOpticalFlow
人工智能·opencv·计算机视觉
linweidong30 分钟前
GO 基础语法和数据类型面试题及参考答案(下)
算法·后端面试·泛型·go面试·go面经·go求职
一勺汤1 小时前
YOLO12 改进|融入 大 - 小卷积LS Convolution 捕获全局上下文与小核分支提取局部细节,提升目标检测中的多尺度
yolo·计算机视觉·多尺度·yolo12·yolo12改进·lsconv·小目标
圈圈编码1 小时前
LeetCode Hot100刷题——合并两个有序链表
java·数据结构·算法·leetcode·链表
老歌老听老掉牙2 小时前
旋量理论:刚体运动的几何描述与机器人应用
python·算法·机器学习·机器人·旋量
无聊的小坏坏2 小时前
用递归算法解锁「子集」问题 —— LeetCode 78题解析
算法·深度优先