主题。我想通过Photoshop中的“颜色”混合模式(具有100%的不透明度)实现一个像素与另一个像素的着色。 我现在要做什么:
如果您对公式感兴趣,请检查以下内容: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中的“颜色”混合模式不仅可以代替色相,而且可以代替饱和度。令人惊讶的是,这使得算法不再复杂,相反却变得更简单(更快):
尽管它仍然很复杂,但我仍然相信它可以简化。
答案 0 :(得分:1)
您可以使用-compose colorize或-compose luminize在ImageMagick中进行类似Photoshop的混合。完成的工作是通过RGB-> HCL-> RGB色彩空间在图像之间进行亮度(亮度)通道转换(变亮),或在图像之间转换色相和饱和度通道的组合(着色)。
请注意,添加颜色通常比删除颜色容易。但是我尝试在这里做后者。
输入图像:
您可以使用-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
如果您撤销订单,那么您将得到:
convert zelda1_tint.jpg zelda1.jpg -compose colorize -composite result2.jpg
convert zelda1.jpg zelda1_tint.jpg -compose luminize -composite result1.jpg
我不确定你要走哪条路。
如果使用后者并增加一些亮度和对比度,则可以更接近第一张图像。
convert zelda1.jpg zelda1_tint.jpg -compose luminize -composite -brightness-contrast 15,-5 result1.jpg
另一种方法是使两个图像之间的亮度(平均值)和对比度(标准偏差)匹配。我使用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)
最后,另一种方法是在两个图像之间使用直方图匹配。我使用我的一个脚本来做到这一点。它还可以在各种颜色空间中做到这一点。在这里,我使用RGB。参见https://en.wikipedia.org/wiki/Histogram_matching
matchimage -c lab zelda1_tint.jpg zelda1.jpg result.jpg
如您所见,在这种情况下,这似乎是更好的方法。
对于有兴趣的人,我的脚本可以在http://www.fmwconcepts.com/imagemagick/index.html
中找到