图像对比度、亮度、饱和度增强算法浅析与代码实现-进阶篇(附源码)
图像对比度、亮度、饱和度增强算法浅析与代码实现-进阶篇(附源码)
一、背景
图像增强作为视频后处理中画质增强技术的一部分,指的是通过调整图片和视频图像画面的饱和度特性,使得画面色彩更加丰富和逼真,提升人的视觉主观感受。由于设备摄像头的多样性,部分摄像头在视频采集时存在饱和度不足,画面发灰,色彩寡淡等问题,这些情况在拍摄室外景物和颜色丰富的场景时尤其容易出现。这些问题可以通过算法的后处理调整进行改善。色彩增强配合视频降噪,暗光增强,对比度调整,边缘增强等技术,可以对视频画质起到较大的提升作用。
二、基本概念
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%)
区别与应用
- 表示方式不同
- RGB 通过组合红、绿、蓝三种基色的强度来表示颜色。
- HSV 通过色调、饱和度和明度来表示颜色,更接近人类的视觉感知。
- 适用场景不同
- RGB 适用于需要直接显示颜色的场景,如屏幕显示、图像存储等。
- HSV 适用于需要进行颜色操作的场景,如图像处理、颜色选择器等,因其可以更方便地调节颜色的亮度和饱和度。
- 颜色操作
- 在 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; 参数值只调整饱和度,不调整色调和亮度,调整后图像:
对比我们可以看到,调整后的图像色彩更加丰富,切二者图像几乎没有明显的感官上的失真;当然本文也是使用的最简单的方法来进行色彩的增加,如果想要对图像进行进一步的清晰化、纹理锐化等的处理,实现更加均衡化、局部细节化的增强处理,则需要更加复杂的算法进行图像处理实现。