Matlab:带灰度蒙版的 Alpha 合成
Matlab: Alpha-Compositing with gray scale mask
我正在尝试在 Matlab 中模拟 alpha 合成的功能,或者更具体地说,是来自 ImageMagick 的合成类型 CopyOpacity 和 Over。第一个目标是屏蔽掉具有严重锯齿边缘的区域,例如集合 (image set with aliasing edges). This should be done with a compatible gray scale mask were black regions should be eliminated and white should be preserved see gray scale mask. Important is the continuous transition between black and white resulting in a continuous transition between transparent and opaque, see screenshot with transparent regions).
中图像中的黑色区域
有两种方法可以将前景 FG 与灰度蒙版组合成背景 BF CM_mask_blur_alpha,但结果不如预期(请参阅 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 通道。
原来不是合成部分的问题,而是遮罩的问题。如果使用具有巨大值 (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);
我正在尝试在 Matlab 中模拟 alpha 合成的功能,或者更具体地说,是来自 ImageMagick 的合成类型 CopyOpacity 和 Over。第一个目标是屏蔽掉具有严重锯齿边缘的区域,例如集合 (image set with aliasing edges). This should be done with a compatible gray scale mask were black regions should be eliminated and white should be preserved see gray scale mask. Important is the continuous transition between black and white resulting in a continuous transition between transparent and opaque, see screenshot with transparent regions).
中图像中的黑色区域有两种方法可以将前景 FG 与灰度蒙版组合成背景 BF CM_mask_blur_alpha,但结果不如预期(请参阅 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 通道。
原来不是合成部分的问题,而是遮罩的问题。如果使用具有巨大值 (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);