【问题标题】:Matlab: Alpha-Compositing with gray scale maskMatlab:带有灰度蒙版的 Alpha 合成
【发布时间】:2017-06-27 06:16:37
【问题描述】:

我正在尝试在 Matlab 中模拟 alpha 合成的功能,或者更具体地说是 ImageMagick 中的 CopyOpacity 和 Over 合成类型。第一个目标是屏蔽具有重锯齿边缘的区域,例如集合(image set with aliasing edges) 中图像中的黑色区域。这应该使用兼容的灰度蒙版来完成,黑色区域应该被消除,白色应该被保留,请参阅gray scale mask。重要的是黑白之间的连续过渡导致透明和不透明之间的连续过渡,请参阅screenshot with transparent regions)

有两种方法可以用灰度掩码 CM_mask_blur_alpha 组合前景 FG 和背景 BF,但结果不如预期(参见 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 通道。

【问题讨论】:

    标签: matlab image-processing compositing


    【解决方案1】:

    原来问题不在于合成部分,而在于遮罩。如果使用具有较大值 (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); 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-07-03
      • 1970-01-01
      • 2021-08-27
      • 2014-10-27
      • 2014-05-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多