问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

图像对比度、亮度、饱和度增强算法浅析与代码实现-进阶篇(附源码)

创作时间:
作者:
@小白创作中心

图像对比度、亮度、饱和度增强算法浅析与代码实现-进阶篇(附源码)

引用
CSDN
1.
https://blog.csdn.net/weixin_42113310/article/details/141757175

一、背景

图像增强作为视频后处理中画质增强技术的一部分,指的是通过调整图片和视频图像画面的饱和度特性,使得画面色彩更加丰富和逼真,提升人的视觉主观感受。由于设备摄像头的多样性,部分摄像头在视频采集时存在饱和度不足,画面发灰,色彩寡淡等问题,这些情况在拍摄室外景物和颜色丰富的场景时尤其容易出现。这些问题可以通过算法的后处理调整进行改善。色彩增强配合视频降噪,暗光增强,对比度调整,边缘增强等技术,可以对视频画质起到较大的提升作用。

二、基本概念

HSV(Hue, Saturation, Value)和 RGB(Red, Green, Blue)是两种不同的颜色表示方法,各自有不同的特点和应用场景。

RGB(红、绿、蓝)

RGB 是一种基于光的颜色表示方法,通过红、绿、蓝三个颜色通道的不同组合来表示各种颜色。每个通道的值范围通常是 0 到 255。

特点:

  • 加色模型:RGB 是一种加色模型,主要用于显示器、电视、相机等基于发光原理的设备。
  • 颜色表示直观:直接表示颜色,但不容易进行颜色操作,例如调节亮度、饱和度等。

颜色表示:

  • 纯红色:RGB(255, 0, 0)
  • 纯绿色:RGB(0, 255, 0)
  • 纯蓝色:RGB(0, 0, 255)
  • 白色:RGB(255, 255, 255)
  • 黑色:RGB(0, 0, 0)

HSV(色调、饱和度、明度)

HSV 是一种更接近人类视觉感知的颜色表示方法,通过色调(Hue)、饱和度(Saturation)和明度(Value)来表示颜色。

特点:

  • 色调(H):表示颜色的类型,范围是 0 到 360 度。0 度为红色,120 度为绿色,240 度为蓝色。
  • 饱和度(S):表示颜色的纯度,范围是 0 到 100%。0% 表示灰色,100% 表示纯色。
  • 明度(V):表示颜色的亮度,范围是 0 到 100%。0% 表示黑色,100% 表示最亮的颜色。

颜色表示:

  • 纯红色:HSV(0, 100%, 100%)
  • 纯绿色:HSV(120, 100%, 100%)
  • 纯蓝色:HSV(240, 100%, 100%)
  • 白色:HSV(0, 0%, 100%)
  • 黑色:HSV(0, 0%, 0%)

区别与应用

  1. 表示方式不同
  • RGB 通过组合红、绿、蓝三种基色的强度来表示颜色。
  • HSV 通过色调、饱和度和明度来表示颜色,更接近人类的视觉感知。
  1. 适用场景不同
  • RGB 适用于需要直接显示颜色的场景,如屏幕显示、图像存储等。
  • HSV 适用于需要进行颜色操作的场景,如图像处理、颜色选择器等,因其可以更方便地调节颜色的亮度和饱和度。
  1. 颜色操作
  • 在 RGB 中,调节亮度和饱和度并不直观,需要对 R、G、B 三个通道进行复杂的计算。
  • 在 HSV 中,调节亮度和饱和度非常直观,只需调整 V 和 S 的值即可。

三、代码实现-进阶篇(OpenCV+C)

上文基础篇中我们已经通过OpenCV可以实现简单的,基于RGB图像的亮度、对比度的变换(增强或者减弱),但是,RGB色彩格式的亮度已经存在于每一个像素中,所以我们对色彩进行调整势必会导致亮度的改变,那么如果我们只想调整图像色彩的饱和度或者色调,而不增加亮度该怎么实现呢,答案就是通过调整HSV色彩格式中的色调(H)和饱和度(S)实现,而改变色调往往会导致有较大的色彩失真,一般我们会通过调整饱和度实现图像的色彩增强,通过OpenCV实现代码如下:

int AdjustImgHSV() 
{
    Mat srcHSV, sat, satAdj, dstMerge, dst;     //sat - saturation饱和度分量  
    Mat imageAwb = imread("D:\\测试视频\\1.jpg");
    vector<Mat> hsvChannels;
    double p1, p2, p3;
    
    cvtColor(imageAwb, srcHSV, CV_BGR2HSV);
    // 分离HSV通道
    cv::split(srcHSV, hsvChannels);
    // 增强亮度和饱和度
    // 以下代码仅为示例,增强方式根据需求设计
    hsvChannels[2] = hsvChannels[2] * 1.3; // 增强亮度
    hsvChannels[1] = hsvChannels[1] * 1.5; // 增强饱和度
    // 限制亮度值的范围在0到255之间
    cv::threshold(hsvChannels[2], hsvChannels[2], 0, 255, cv::THRESH_TOZERO);
    cv::threshold(hsvChannels[2], hsvChannels[2], 255, 255, cv::THRESH_TRUNC);
    //cv::threshold(hsvChannels[1], hsvChannels[2], 0, 255, cv::THRESH_TOZERO);
    //cv::threshold(hsvChannels[1], hsvChannels[2], 255, 255, cv::THRESH_TRUNC);
    merge(hsvChannels, dstMerge);
    cvtColor(dstMerge, dst, CV_HSV2BGR);
    imwrite("D:\\测试视频\\1-adjust-HSV.jpg", dst);
    return 0;
}

代码很简单,通过cvtColor色彩转换算法,将RGB色彩空间的图像转换成HSV色彩空间,通过以上代码我们可以实现对图像的饱和度和亮度进行调整,然后再合成到统一的图像中,调整后图像对比如下:

原图:

调整参数 亮度alpha = 1.3,饱和度beta=1.5; 参数值只调整亮度和饱和度,不调整色调,调整后图像:

可以看到,相对于通过RGB色彩空间格式的调整方式,通过HSV色彩空间调整出的增强色彩和亮度的图像更加自然和真实,失真率较低,比较符合人类的感官。

然后,我们调整参数 亮度alpha = 1.0,饱和度beta=1.5; 则可以得到我们想要的图像增强效果,即只增加色彩的饱和度,不增加亮度,使得增强后的图像更加自然,调整后图像对比如下:

原图:

调整参数 亮度alpha = 1.0,饱和度beta=1.5; 参数值只调整饱和度,不调整色调和亮度,调整后图像:

对比我们可以看到,调整后的图像色彩更加丰富,切二者图像几乎没有明显的感官上的失真;当然本文也是使用的最简单的方法来进行色彩的增加,如果想要对图像进行进一步的清晰化、纹理锐化等的处理,实现更加均衡化、局部细节化的增强处理,则需要更加复杂的算法进行图像处理实现。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号