0

我正在尝试在 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 通道。

4

1 回答 1

0

事实证明,问题不在于合成部分,而在于遮罩。如果使用具有巨大值 (se = strel('disk',9)) 的形态学操作 (imdilate) 放大蒙版,然后使用相对较大的值(如 sigma=3)进行模糊 (imgaussfilt),则锯齿边缘被掩盖平稳过渡。

whiteImage = 255 * ones(cm_out_h, cm_out_h, 'uint8');
conformal = maketform('custom', 2, 2, [], @conformalInverse_0001, []);
CM_mask = imtransform(whiteImage, conformal, ...,  'FillValues', 0);
% MORPHOLOGY: ENLARGE BLACK WITH imdilate
CM_mask = imcomplement(CM_mask);
se = strel('disk',9);
CM_mask = imdilate(CM_mask,se);
CM_mask = imcomplement(CM_mask);
% BLUR
CM_mask_blur = imgaussfilt(CM_mask, 3);      
% ALPHA
CM_mask_blur_alpha = double(CM_mask_blur)/255;
CM_mask_blur_alpha = im2double(CM_mask_blur_alpha); 
于 2017-02-23T10:03:30.437 回答