我正在尝试在 Matlab 中模拟 alpha 合成的功能,或者更具体地说是 ImageMagick 中的 CopyOpacity 和 Over 合成类型。第一个目标是屏蔽具有重锯齿边缘的区域,例如集合中图像中的黑色区域(具有锯齿边缘的图像集)。这应该使用兼容的灰度蒙版来完成,黑色区域应该被消除,白色应该被保留,参见灰度蒙版。重要的是黑白之间的连续过渡导致透明和不透明之间的连续过渡,请参见 带有透明区域的屏幕截图)。
有两种方法可以用灰度掩码 CM_mask_blur_alpha 组合前景 FG 和背景 BF,但结果不如预期(参见使用 ImageMagick进行后处理的图像集作为纯 Matlab 程序的参考)。
1)在第一个代码中,灰度掩码意外地被视为二进制掩码,导致以前黑色区域的边缘出现不可接受的混叠效果(第一种方法的图像集):
FG = uint8(CM_mask_blur_alpha .* FG + (1 - CM_mask_blur_alpha) .* BG);
2)第二种方法导致前景和背景之间可见的连续过渡,但剩余的FG存在混叠效果(第二种方法的图像集):
FG = uint8(bsxfun(@times, CM_mask_blur_alpha, FG) + bsxfun(@times, (1 - CM_mask_blur_alpha), BG));
似乎一步法不起作用,所以我正在寻找像 ImageMagick 中那样的两步法,它屏蔽掉黑色区域,从而产生具有透明度的中间图像,作为第二步,合成这个中间图像在一个背景。这部分是 MATLAB 中的问题设置:在 RGB 图像上应用透明蒙版并与另一个图像混合,但没有灰度蒙版,我无法调整解决方案部分,例如使用从灰度蒙版派生的值生成 alpha 通道。