我试图在Matlab中模拟alpha合成的功能,或者更具体地从ImageMagick中编写类型CopyOpacity和Over。第一个目标是屏蔽具有较大混叠边缘的区域,例如集合(image set with aliasing edges)中图像中的黑色区域。这应该使用兼容的灰度掩模来完成,应该消除黑色区域并保留白色,参见gray scale mask。重要的是黑色和白色之间的连续过渡导致透明和不透明之间的连续过渡,请参阅screenshot with transparent regions)。
有两种方法使用灰度掩模CM_mask_blur_alpha构建具有背景BF的前景FG,但结果不符合预期(参见image set with post-processing,其中ImageMagick作为纯Matlab过程的参考)。
1)在第一个代码中,灰度掩模意外地被视为二进制掩码,导致在以前的黑色区域(image set for first approach)边缘产生不可接受的混叠效果:
FG = uint8(CM_mask_blur_alpha .* FG + (1 - CM_mask_blur_alpha) .* BG);
2)第二种方法导致前景和背景之间的可见连续过渡但是剩余的FG存在混叠效应(image set for second approach):
FG = uint8(bsxfun(@times, CM_mask_blur_alpha, FG) + bsxfun(@times, (1 - CM_mask_blur_alpha), BG));
似乎一步到位的方法不起作用,所以我正在寻找像ImageMagick这样的两步法,从黑色区域中遮蔽,产生具有透明度的中间图像,并作为第二步构成这个中间图像在背景上。这部分是一个问题设置,如 MATLAB: Applying transparent mask over an RGB image and blending with another但是没有灰度蒙版,我无法调整解决方案部分,例如使用从灰色蒙版派生的值生成alpha通道。
答案 0 :(得分:0)
事实证明问题不是合成部分而是面具。如果使用具有巨大值的形态学操作(imdilate)放大掩模(se = strel(' disk',9))然后模糊(imgaussfilt)具有相对较大的值(如sigma = 3)混叠边缘被平滑过渡掩盖。
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);