对比度保留之彩色图像去色算法---基础算法上档次。

2022年01月15日 阅读数:2
这篇文章主要向大家介绍对比度保留之彩色图像去色算法---基础算法上档次。,主要内容包括基础应用、实用技巧、原理机制等方面,希望对大家有所帮助。

图像处理 javascript


 因昨日写的匆忙,有很多错误,特重写并增长了适当的解释,而且以为对于搞图像处理的朋友来讲,这个可能在不少场合仍是用得着的,所以删除了原随笔,又从新发布了下,非有意刷屏。java

     原来一直认为彩色图像的去色算法没啥研究价值,网络上已经有不少相似的算法了,好比著名的Gray = R*0.299 + G*0.587 + B*0.114公式,或者LAB颜色通道的L值,HSL的L通道等等,直到最近看一些论文,发现原来也有不少人对这个过程进行过详细的研究和创新。在学习这些算法的同时,使我也认识到,任何你认为简单的东西在背后都有可能有着复杂的机理,只是你没有发现而已。算法

      我先拿两个图片的例子来讲明为何要对彩图去色的过程进行研究,同时也说明了经常使用的方法存在的一些缺陷。数组

      下面水平4副图从左至右依次为原图、PS的彩色灰度命令、PS的去色命令以及matlab的rgb2gray命令的效果。网络

 对比度保留之彩色图像去色算法---基础算法上档次。_灰度 对比度保留之彩色图像去色算法---基础算法上档次。_图像处理_02 对比度保留之彩色图像去色算法---基础算法上档次。_javascript_03 对比度保留之彩色图像去色算法---基础算法上档次。_灰度_04        

 对比度保留之彩色图像去色算法---基础算法上档次。_灰度_05 对比度保留之彩色图像去色算法---基础算法上档次。_灰度_06 对比度保留之彩色图像去色算法---基础算法上档次。_灰度_07 对比度保留之彩色图像去色算法---基础算法上档次。_图像处理_08

    上面的效果有什么问题,不错,不少人包括我开始也以为彷佛没啥大毛病,可仔细看看,你就会发现第一幅图中的晚霞以及晚霞在水中的倒影和太阳在去色后已经很难找到其踪迹了,而第二副图的红花和绿叶去色后基本变得一致了,这其实便是所谓的对比度丢失,这种丢失对于普通的图像处理用户也许问题不大,不过对于图像分析方面是很不利的。app

     针对这个问题,很多做者都提出了解决方案,我这里列出三篇论文供有兴趣的朋友参考:dom

     (1)​​Color2Gray: Salience-Preserving Color Removal  ​​,做者Amy A. Gooch Sven C. Olsen Jack Tumblin Bruce Goochtcp

     这个代码仅仅具备学习价值,由于做者在论文中说100*100大小的图像算法用时12.7秒,这么长的时间那还搞个屁啊。ide

     (2)​​Contrast Preserving Decolorization​​ ,做者 Cewu Lu Li Xu Jiaya Jia函数

     以及:

     (3)​​Real-time Contrast Preserving Decolorization​​,做者 Cewu Lu Li Xu Jiaya Jia

  后两篇文章配套的下载地址为:​​http://appsrv.cse.cuhk.edu.hk/~xuli/mypapers/cpcolor2gray_v2.zip​

    后两篇文章都是咱们国人的杰做,不过不是大陆的,是香港大学的几位高人的做品,我特别关注的是Jiaya Jia,。

    特别是最后一篇文章的算法,效果好且执行速度快,能知足实时的要求。

    这3篇论文都是以最小化一个能量函数为目标的:

          对比度保留之彩色图像去色算法---基础算法上档次。_javascript_09      (1)

     其中gx,gy为灰度化后的像素值。而δx,y则表示颜色对比度,三篇论文中开始的时候都是用的LAB颜色空间的一些相关计算公式。

     在第三篇论文中,做者进一步将目标函数改写为:

             对比度保留之彩色图像去色算法---基础算法上档次。_灰度_10  (2)

  式中:Nб是高斯分布函数,△gx,y=gx-gy ;

  而后优化的目标就是求上式的最大值。

     在第三篇论文中提出算法最为实用,他没有像第二篇那样采用了二维的模型,而是简化为一维模型,相似于公式Gray = R*0.299 + G*0.587 + B*0.114,论文中也是使用W1,W2,W3三个系数来控制结果值,可是这三个系数不是固定的,而是同用户输入的图像自适应的。同时有约束条件W1>0;W2>0;W3>0,以及W1+W2+W3=1;知足这几个条件的W1,W2,W3的值的组合仍是有无限个的,可是做者注意到系数的微小变化对于输出的结果的影响不是特别大,所以,论文中提出了将每一个系数在[0,1]之间量化为10等份,即只取0、0.一、0.二、0.三、0.四、0.五、0.六、0.七、0.8,0.九、1.0这11个值,在知足约束条件的状况下,W一、W二、W2的组合总共只会有11*(11+1)/2 =66 种,以下所示:

对比度保留之彩色图像去色算法---基础算法上档次。_javascript_11

W = [    0         0    1.0000
0 0.1000 0.9000
0 0.2000 0.8000
0 0.3000 0.7000
0 0.4000 0.6000
0 0.5000 0.5000
0 0.6000 0.4000
0 0.7000 0.3000
0 0.8000 0.2000
0 0.9000 0.1000
0 1.0000 0
0.1000 0 0.9000
0.1000 0.1000 0.8000
0.1000 0.2000 0.7000
0.1000 0.3000 0.6000
0.1000 0.4000 0.5000
0.1000 0.5000 0.4000
0.1000 0.6000 0.3000
0.1000 0.7000 0.2000
0.1000 0.8000 0.1000
0.1000 0.9000 0
0.2000 0 0.8000
0.2000 0.1000 0.7000
0.2000 0.2000 0.6000
0.2000 0.3000 0.5000
0.2000 0.4000 0.4000
0.2000 0.5000 0.3000
0.2000 0.6000 0.2000
0.2000 0.7000 0.1000
0.2000 0.8000 0
0.3000 0 0.7000
0.3000 0.1000 0.6000
0.3000 0.2000 0.5000
0.3000 0.3000 0.4000
0.3000 0.4000 0.3000
0.3000 0.5000 0.2000
0.3000 0.6000 0.1000
0.3000 0.7000 0.0000
0.4000 0 0.6000
0.4000 0.1000 0.5000
0.4000 0.2000 0.4000
0.4000 0.3000 0.3000
0.4000 0.4000 0.2000
0.4000 0.5000 0.1000
0.4000 0.6000 0.0000
0.5000 0 0.5000
0.5000 0.1000 0.4000
0.5000 0.2000 0.3000
0.5000 0.3000 0.2000
0.5000 0.4000 0.1000
0.5000 0.5000 0
0.6000 0 0.4000
0.6000 0.1000 0.3000
0.6000 0.2000 0.2000
0.6000 0.3000 0.1000
0.6000 0.4000 0.0000
0.7000 0 0.3000
0.7000 0.1000 0.2000
0.7000 0.2000 0.1000
0.7000 0.3000 0.0000
0.8000 0 0.2000
0.8000 0.1000 0.1000
0.8000 0.2000 0.0000
0.9000 0 0.1000
0.9000 0.1000 0.0000
1.0000 0 0];

对比度保留之彩色图像去色算法---基础算法上档次。_javascript_11

   优化的目的就是从输入图像的数据肯定最优的权值使得式(2)的值最大。

     考虑到图片内在的颜色的冗余性,为进一步提升速度,论文提出不在原始的图像中搜索最优系数,而是现将图像缩小到必定范围,在缩放后的图中找寻,做者建议缩小到64*64(原图为等宽高的状况)大小,此时即能提升速度,又不会下降精度,可是注意一点就是最好是采用最近邻插值,由于这不会产生新的像素。    

     上面两种优化方式,特别是搜索空间的这种离散化,我想在不少算法中均可以去模仿的。

  贴些和第三篇文章基本对应的matlab代码。

对比度保留之彩色图像去色算法---基础算法上档次。_javascript_11

1 function  img  = rtcprgb2gray(im)
2
3 %% Proprocessing
4 [n,m,ch] = size(im);
5 sigma = 0.05;
6 W = wei();
7
8
9 %% Global and Local Contrast Computing
10 ims = imresize(im, round(64/sqrt(n*m)*[n,m]),'nearest');
11 R = ims(:,:,1);G = ims(:,:,2);B = ims(:,:,3);
12 imV = [R(:),G(:),B(:)];
13 defaultStream = RandStream.getDefaultStream; savedState = defaultStream.State;
14 t1 = randperm(size(imV,1));
15 Pg = [imV - imV(t1,:)];
16
17 ims = imresize(ims, 0.5 ,'nearest');
18 Rx = ims(:,1:end-1,1) - ims(:,2:end,1);
19 Gx = ims(:,1:end-1,2) - ims(:,2:end,2);
20 Bx = ims(:,1:end-1,3) - ims(:,2:end,3);
21
22 Ry = ims(1:end-1,:,1) - ims(2:end,:,1);
23 Gy = ims(1:end-1,:,2) - ims(2:end,:,2);
24 By = ims(1:end-1,:,3) - ims(2:end,:,3);
25 Pl = [[Rx(:),Gx(:),Bx(:)];[Ry(:),Gy(:),By(:)]];
26
27 P = [Pg;Pl ];
28
29 det = sqrt(sum(P.^2,2))/1.41 ;
30
31 P( (det < 0.05),:) = []; det( (det < 0.05)) = [];
32 detM = repmat(det,[1,size(W,1)]); L = P*W';
33
34 %% Energy optimization
35
36 U = log(exp(- (L + detM ).^2/sigma.^2) + exp(- (L- detM).^2/sigma.^2));
37 Es = mean(U);
38
39
40
41 %% Output
42 [NULLval,bw] = max(Es);
43 img = imlincomb(W(bw,1),im(:,:,1) , W(bw,2),im(:,:,2) , W(bw,3),im(:,:,3));
44
45 end

对比度保留之彩色图像去色算法---基础算法上档次。_javascript_11

  第10行即为减小搜索样本。第14行产生不重复的随即对,第27行以及下面计算det的代码未和原文对应,不过彷佛不影响结果,第36行计算能量,而后取能量最大的哪一个做为权值。

     上述代码中PL值其实即计算水平和垂直方向的梯度值,而再次使用ims = imresize(ims, 0.5 ,'nearest');这样的语句也是为了加快计算速度,对为何用这样的计算方法,原始论文也没有说起,编码的时候彷佛去掉这个pl效果也没啥区别。

     上述代码若是要在项目中使用,还必须换为其余的语种,转换应该不存在困难的地方,基本就是一些矩阵或者说数组的操做,惟一比较困难的就是randperm函数,他产生必定范围内的不重复的随机数,抑或是复制下面的代码:

对比度保留之彩色图像去色算法---基础算法上档次。_javascript_11

private static int[] RandPerm(int N)
{
//javascript:void(0)
int X;
Random Rnd = new Random(Environment.TickCount);
int[] TempArray = new int[N];
int[] Value = new int[N];
for (X = 0; X < N; X++) TempArray[X] = X;
for (X = 0; X < N; X++)
{
int Seed = Rnd.Next(0, N - X);     //从剩下的随机数里生成
Value[X] = TempArray[Seed]; //赋值给结果数组
TempArray[Seed] = TempArray[N - X - 1];   //把随机数产生过的位置替换为未被选中的值。
}
return Value;
}

对比度保留之彩色图像去色算法---基础算法上档次。_javascript_11

     至于算法的更加原理性的东西,只能看论文自己了吧,实用为王,对于那些提供了参考代码的论文,基本知道原理的意思,而后关键就是掌握代码的改写了。

     至于速度,在我I3的笔记本CPU上,参考上述M代码,用C#编制的程序,对于1024*768的图片耗时约为40ms(未优化代码,优化应该能达到20ms)。

     而算法效果,咱们能够经过如下十几副图像的比较得出结论。

     下面水平4副图从左至右依次为原图、PS的彩色灰度命令、PS的去色命令以论文3的结果。

 对比度保留之彩色图像去色算法---基础算法上档次。_javascript_17 对比度保留之彩色图像去色算法---基础算法上档次。_灰度_18 对比度保留之彩色图像去色算法---基础算法上档次。_javascript_19 对比度保留之彩色图像去色算法---基础算法上档次。_javascript_20

 对比度保留之彩色图像去色算法---基础算法上档次。_javascript_21 对比度保留之彩色图像去色算法---基础算法上档次。_灰度_22 对比度保留之彩色图像去色算法---基础算法上档次。_javascript_23 对比度保留之彩色图像去色算法---基础算法上档次。_图像处理_24

 对比度保留之彩色图像去色算法---基础算法上档次。_javascript_25 对比度保留之彩色图像去色算法---基础算法上档次。_灰度_26 对比度保留之彩色图像去色算法---基础算法上档次。_javascript_27 对比度保留之彩色图像去色算法---基础算法上档次。_图像处理_28

 对比度保留之彩色图像去色算法---基础算法上档次。_图像处理_29 对比度保留之彩色图像去色算法---基础算法上档次。_javascript_30 对比度保留之彩色图像去色算法---基础算法上档次。_灰度_31 对比度保留之彩色图像去色算法---基础算法上档次。_灰度_32

 对比度保留之彩色图像去色算法---基础算法上档次。_javascript_33 对比度保留之彩色图像去色算法---基础算法上档次。_灰度_34 对比度保留之彩色图像去色算法---基础算法上档次。_图像处理_35  对比度保留之彩色图像去色算法---基础算法上档次。_灰度_36

 对比度保留之彩色图像去色算法---基础算法上档次。_图像处理_37 对比度保留之彩色图像去色算法---基础算法上档次。_javascript_38 对比度保留之彩色图像去色算法---基础算法上档次。_灰度_39 对比度保留之彩色图像去色算法---基础算法上档次。_灰度_40

 对比度保留之彩色图像去色算法---基础算法上档次。_灰度_41 对比度保留之彩色图像去色算法---基础算法上档次。_图像处理_42 对比度保留之彩色图像去色算法---基础算法上档次。_图像处理_43 对比度保留之彩色图像去色算法---基础算法上档次。_javascript_44

 对比度保留之彩色图像去色算法---基础算法上档次。_灰度_45 对比度保留之彩色图像去色算法---基础算法上档次。_灰度_46 对比度保留之彩色图像去色算法---基础算法上档次。_图像处理_47 对比度保留之彩色图像去色算法---基础算法上档次。_javascript_48

 对比度保留之彩色图像去色算法---基础算法上档次。_javascript_49 对比度保留之彩色图像去色算法---基础算法上档次。_灰度_50 对比度保留之彩色图像去色算法---基础算法上档次。_图像处理_51 对比度保留之彩色图像去色算法---基础算法上档次。_图像处理_52

 对比度保留之彩色图像去色算法---基础算法上档次。_javascript_53 对比度保留之彩色图像去色算法---基础算法上档次。_javascript_54 对比度保留之彩色图像去色算法---基础算法上档次。_灰度_55 对比度保留之彩色图像去色算法---基础算法上档次。_灰度_56

 对比度保留之彩色图像去色算法---基础算法上档次。_javascript_57 对比度保留之彩色图像去色算法---基础算法上档次。_javascript_58 对比度保留之彩色图像去色算法---基础算法上档次。_灰度_59 对比度保留之彩色图像去色算法---基础算法上档次。_灰度_60


  对比度保留之彩色图像去色算法---基础算法上档次。_灰度_61                  对比度保留之彩色图像去色算法---基础算法上档次。_图像处理_62               对比度保留之彩色图像去色算法---基础算法上档次。_javascript_63            对比度保留之彩色图像去色算法---基础算法上档次。_javascript_64

        原图                  PS的彩色灰度                  PS的去色命令                论文3的结果

  由以上举的一些例子,能够明显的看出论文中的效果要不少,有些图PS换为灰度后丢失了太多的信息了就变得毫无心义了。

    在计算机识别领域,有不少算法须要将彩色先换为灰度,我想这个时候上述论文中的这种转换效果就很是有意义了。

    未提供源代码,仍是那句老话,会者不难。

    关于去色,仔细找找,其实还有不少其余的比较成功和优秀的算法,所以,不要小看一些基础的算法,只要你仔细研究,总会有新发现。

    欢迎各位指正,若是以为对您有所帮助,烦请点击右下角的推荐,大家的推荐和评价是我继续努力和写做的根本动力。



*****************************基本上我不提供源代码,可是我会尽可能用文字把对应的算法描述清楚或提供参考文档*********************

*************************************由于靠本身的努力和实践写出来的效果才真正是本身的东西,人必定要靠本身****************************

*********************************做者: laviewpbt  

root