逐像素着色的最快方法

时间:2018-07-18 12:00:30

标签: colors formula photoshop blending color-blending

主题。我想通过Photoshop中的“颜色”混合模式(具有100%的不透明度)实现一个像素与另一个像素的着色。 我现在要做什么:

  1. 获取蒙版像素的色相;
  2. 将源像素从RGB转换为HSL;
  3. 替换色相并转换回RGB;

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

但是对于此任务,从/向HSL / RGB转换回'n'似乎过于繁琐。

所以我正在寻找一种更快的方法。我猜应该有某种方式可以计算出与RGB相乘的系数,然后对于源像素,只需执行以下操作即可:

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

UPD:实际上,我不需要像在Photoshop中那样完全。我仅以PS混合模式为例。我在自定义卷积例程中使用它,因此我希望它是快速的,但是精度并不重要,因此即使可以将其近似几个百分点也是如此。只是我想找到一种无需这些复杂的HSL / RGB转换即可更改像素色调的方法...


UPD2:经过一些测试,我意识到我的方法(替换色相)实际上与我想要的相去甚远。另外,经过一些挖掘,我发现PS中的“颜色”混合模式不仅可以代替色相,而且可以代替饱和度。令人惊讶的是,这使得算法不再复杂,相反却变得更简单(更快):

  1. 我们不仅需要获得色相,还需要获得蒙版像素的饱和度
  2. 但是现在我们不需要将src像素从RGB转换为HSL,全部 我们需要的是光度,它的计算速度远快于满度 RGB-> HSL例程...
  3. 具有src-发光度,mask-Hue和Sat。我们将其转换为RGB ...

尽管它仍然很复杂,但我仍然相信它可以简化。

1 个答案:

答案 0 :(得分: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。 该方程式表示归一化强度,因此平均值为零 并且由于除以 标准偏差。我们解决这个方程以形成线性变换 根据{{​​1}}在I1和I2之间,其中I2=A*I1+B是斜率 或增益,A=(Std2/Std1)是偏差的截距。可以在不同的色彩空间中进行匹配。我在这里使用LAB,但也可以在RGB或YCbCr中完成。

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

B=(Mean2-A*Mean1)


enter image description here

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

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


enter image description here

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

对于有兴趣的人,我的脚本可以在http://www.fmwconcepts.com/imagemagick/index.html

中找到