在平滑过渡中不显示前景

时间:2015-11-25 11:23:21

标签: matlab image-processing filter mask

我想使用alpha混合使用和平滑遮罩来实现平滑过渡的图像混合。我使用高斯滤波器作为掩模,现在我正在尝试将其他两个图像组合起来。我使用平滑的面具作为重量。

x_iy_i ....像素i的颜色信息

alpha_i ...像素i中掩码的值

公式:z_i = alpha_i*x_i + (1 - alpha_i)*y_i

我的尝试:

mask = imread('mask.png');
foreground = imread('fg.jpg');
background = imread('bg.jpg');
[r,c,~]=size(mask);
A = zeros(size(foreground),'like', foreground);
fspe = fspecial('gaussian', 100);  
smoothMask = imfilter(double(mask), fspe, 'same'); 
for i=1:r 
  for j=1:c       
    for d=1:3            
      alpha = mask(i,j,d);
      A(i,j,d) = alpha*foreground(i,j,d)+(1-alpha)*background(i,j,d);           
    end    
  end
end
imshow(A);

最后我得到了背景,但前景是白色的。请帮忙。

1 个答案:

答案 0 :(得分:0)

您的A类型为double,范围为[0..255]。当imshow类型为double的图片的预期比例为[0..1]时,这就是所有像素都显示为饱和的原因。

修正:

imshow(A,[])

或者

imshow(A/255)

关于的一句话:在Matlab中,显式循环所有行列和通道只是为了对图像进行乘法和求和(3D数组)是非常冗余的。它可以轻松完成

A = mask.*foreground + (1-mask).*background;

不是很可爱吗?

请注意*运算符与.*运算符之间的差异 - 它是矩阵乘法和逐元素乘法之间的差异。