我想使用alpha混合使用和平滑遮罩来实现平滑过渡的图像混合。我使用高斯滤波器作为掩模,现在我正在尝试将其他两个图像组合起来。我使用平滑的面具作为重量。
x_i
和y_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);
最后我得到了背景,但前景是白色的。请帮忙。
答案 0 :(得分:0)
您的A
类型为double
,范围为[0..255]
。当imshow
类型为double
的图片的预期比例为[0..1]
时,这就是所有像素都显示为饱和的原因。
修正:
imshow(A,[])
或者
imshow(A/255)
关于vectorization的一句话:在Matlab中,显式循环所有行列和通道只是为了对图像进行乘法和求和(3D数组)是非常冗余的。它可以轻松完成
A = mask.*foreground + (1-mask).*background;
不是很可爱吗?
请注意*
运算符与.*
运算符之间的差异 - 它是矩阵乘法和逐元素乘法之间的差异。