之前研究低光图像增强时,看到一篇博客,里面介绍了一种方法,没有说明出处,也没有说明方法的名字,这里暂时叫做 G-channel 算法。
博客地址:低照度图像增强(附步骤及源码)_低照度图像增强算法_grafx的博客-CSDN博客
算法过程博客里面简单说明了算法的执行过程,这里重复如下:
(相关资料图)
将绿色通道反色后作为系数值,分别与各个通道相乘,得到新图层;将新图层与原图做一次滤色混合,f(a,b)=1-(1-a)*(1-b);为了了解算法原理,经过查找,找到了几篇博客:
基于photoshop滤色混合模式的图片亮度改变_悍然的博客-CSDN博客正片叠底(Multiply)和滤色(Screen)是两种基本的混合模式_滤色和正片叠底_e财富800的博客-CSDN博客Photoshop图层混合模式的计算公式_pizi0475的博客-CSDN博客从这几篇博客里,可以将算法过程归纳为Photoshop的2个处理步骤:
Multiply正片叠底:C=(A×B)/255,A为基色,B为混合色,会使得图像C整体亮度更暗Screen滤色:C=255-(A反相×B反相)/255,与上面相反,会使得图像C整体亮度更亮算法实现博客中给出了opencv的实现代码,下面使用matlab进行了仿真,代码如下所示:
close all;clear;clc;src = imread("8.bmp");im = double(src);r = im(:,:,1);g = im(:,:,2);b = im(:,:,3);g_alpha = 255 - g;r1 = r .* g_alpha / 255;g1 = g .* g_alpha / 255;b1 = b .* g_alpha / 255;r = 255 - (255 - r) .* (255 - r1) / 255;g = 255 - (255 - g) .* (255 - g1) / 255;b = 255 - (255 - b) .* (255 - b1) / 255;dst = cat(3, r, g, b);dst = uint8(round(dst));imshow([src, dst])
由于找不到博客里测试图像的原图,这里换了另外一张测试图像,结果如下,这里执行2次算法,可以看到结果与博客里面的结果还是很相似的,说明仿真没有问题。
为了方便分析,这里对代码做了调整(原始代码,数据范围为[0,255],调整后的代码,数据范围归一化到[0,1]),如下所示,与原始结果是一致:
close all;clear;clc;src = imread("8.bmp");im = double(src)/255;r = im(:,:,1);g = im(:,:,2);b = im(:,:,3);g_alpha = 1 - g;r1 = r .* g_alpha;g1 = g .* g_alpha;b1 = b .* g_alpha;r = 1 - (1 - r) .* (1 - r1);g = 1 - (1 - g) .* (1 - g1);b = 1 - (1 - b) .* (1 - b1);dst = cat(3, r, g, b);dst = uint8(round(dst*255));imshow([src, dst])
原理分析下面就个人理解来对算法原理做个简单的分析。
步骤一:Multiply正片叠底正片叠底公式为:C=(A×B)/255,数据范围都为[0,255],这里全部都归一化到[0,1],则公式变为:C=A×B。