首页 文章

通过其他像素着色像素的最快方法

提问于
浏览
0

学科 . 我希望通过其他像素实现一个像素的着色,如Photoshop中的“颜色”混合模式(100%不透明度) . 我现在应该做什么:

  • 得到掩码像素的色调;

  • 将源像素从RGB转换为HSL;

  • 替换色调并转换回RGB;

如果您对该公式感兴趣 - 请检查:Please explain this color blending mode formula so I can replicate it in PHP/ImageMagick

但是对于这个任务,从/向HSL / RGB转换回来似乎太过分了 .

所以我正在寻找一种更快的方法 . 我想应该有办法以某种方式计算RGB乘法系数然后对于源像素只是简单地做这样的事情:

src_R *= mult_R;
 src_G *= mult_G;
 src_B *= mult_B;

UPD:其实我不需要它像Photoshop一样 exactly . 我刚才提到了PS混合模式 . 我在我的自定义循环程序中使用它,所以我希望它快,但精度并不重要,所以即使它可以近似几个百分点 . 它没有这些复杂的HSL / RGB转换时的音调......


UPD2:经过一些测试后,我意识到我的方法(取代色调)实际上远非我想要的 . 经过一些挖掘后,我发现PS中的“颜色”混合模式不仅取代了Hue,还取代了饱和度 . 令人惊讶的是,这使算法不复杂,但相反更简单(更快):

  • 我们不仅需要获得Hue,还需要获得掩模像素的饱和度

  • 但现在我们不需要将src-pixel从RGB转换为HSL,因为我们所需要的只是lightocity,其计算速度比完全RGB-> HSL例程快得多......

  • 与src-Luminocity,mask-Hue和Sat.我们将它转换为RGB ...

它仍然相当复杂,我仍然相信它可以简化 .

1 回答

  • 1

    您可以使用-compose colorize或-compose luminize在ImageMagick中进行类似Photoshop的混合 . 所做的是通过RGB-> HCL-> RGB颜色空间传输图像之间的强度(亮度)通道(发光)或图像之间的色调和饱和通道的组合(着色) .

    请注意,添加颜色通常比删除颜色更容易 . 但我试着在这里做后者 .

    输入图片:

    enter image description here

    enter image description here

    您可以使用-compose luminize或-compose colorize使第一个图像看起来更像第二个图像 . 它只取决于两个输入图像的顺序 .

    convert zelda1.jpg zelda1_tint.jpg  -compose colorize  -composite result.jpg
    
    convert zelda1_tint.jpg zelda1.jpg -compose luminize -composite result.jpg
    

    enter image description here

    如果你颠倒了订单,那么你得到:

    convert zelda1_tint.jpg zelda1.jpg -compose colorize -composite result2.jpg
    
    convert zelda1.jpg zelda1_tint.jpg -compose luminize -composite result1.jpg
    

    enter image description here

    我不确定你想走哪条路 .

    如果你采用后者并添加一些亮度和对比度,那么你可以更接近第一张图像 .

    convert zelda1.jpg zelda1_tint.jpg -compose luminize -composite -brightness-contrast 15,-5 result1.jpg
    

    enter image description here

    另一种方法是匹配两个图像之间的亮度(平均值)和对比度(标准偏差) . 我使用我的一个Unix bash shell脚本来做到这一点 .

    匹配使用每个图像的平均值和标准偏差,根据等式: (I2-Mean2)/Std2 = (I1-Mean1)/Std1 . 该等式表示归一化强度,使得由于除以标准偏差,其具有零均值和近似相同的值范围 . 我们根据 I2=A*I1+B 求解此方程以在I1和I2之间形成线性变换,其中 A=(Std2/Std1) 是斜率或增益, B=(Mean2-A*Mean1) 是偏差的截距 . 匹配可以在不同的颜色空间中完成 . 这里我使用LAB,但它也可以用RGB或YCbCr完成 .

    另见https://www.pyimagesearch.com/2014/06/30/super-fast-color-transfer-images/http://im.snibgo.com/gainbias.htm

    matchimage -c lab zelda1_tint.jpg zelda1.jpg result.jpg
    

    enter image description here

    最后,另一种方法是使用两个图像之间的直方图匹配 . 我使用我的一个脚本来做到这一点 . 它也可以在各种颜色空间中做到这一点 . 在这里我使用RGB . 见https://en.wikipedia.org/wiki/Histogram_matching

    histmatch -c rgb zelda1.jpg zelda1_tint.jpg result3.jpg
    

    enter image description here

    如您所见,在这种情况下,这似乎是更好的方法 .

    对于任何感兴趣的人,我的脚本可以在http://www.fmwconcepts.com/imagemagick/index.html找到

相关问题