Matlab:Alpha合成与灰度掩模



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

事实证明,问题不在于合成部分,而在于掩码。如果用具有巨大值(se=strel('disk’,9))的形态学运算(imexpate)放大掩模,然后用相对较大的值(如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); 

最新更新