我试图根据面具中的信息合并两个图像。如果蒙版是0,我使用背景图像中的颜色信息,如果蒙版是1,我使用前景图像的颜色信息。因为蒙版和两者都是 图像大小相同,我想使用矩阵的逻辑索引来实现这一点。
我的尝试:
TIMESTAMP_FORMAT
结果看起来像一个闪烁的蓝色图像,但我不想要那个。请帮忙。
答案 0 :(得分:3)
你可以更简洁地做到这一点:
f = double(foreground).*double(mask);
b = double(background).*double(~mask);
blend = f+b;
imshow(blend, []);
使用逻辑索引也可以
foreground(logical(mask)) = 0;
background(logical(~mask)) = 0;
blend = foreground+background;
ISNOT运算符'〜'在第二行反转矩阵,因此您可以剪切出背景区域。
注意:这适用于黑白(一个频道)。对于彩色图像,请参阅rayryeng的解决方案。
答案 1 :(得分:2)
您的代码存在两个问题。第一个问题是您尝试将颜色像素分配给输出图像A
,但此图像仅二维。您想要一个带有三个频道的图像,而不是两个。此外,您指定的输出图像类型是错误的。默认情况下,输出图片A
的类型为double
,但您正在将值复制到不是 double
...很可能无符号的8位整数。
因此,将图像转换为与输入图像相同的类型。假设两个输入图像的类型相同,请初始化A
,以便:
A = zeros(size(foreground), class(foreground));
这正确地使彩色图像与任何输入具有相同的类型,假设它们都是相同的类型。
现在,您的for
循环很好,但如果您使用logical
索引进行一次拍摄,效果会更好。如果您想使用logical
索引编辑,请创建一个最初为您已做过的新图片,但请确保您的面具有三个频道以匹配其他图片的频道数量有。之后,您只需索引每个图像并相应地设置正确的位置:
mask = imread('mask.png');
foreground = imread('fg.jpg');
background = imread('bg.jpg');
[r,c,d]=size(mask); %// Change
%// If your mask isn't three channels, make it so
%// Change
if d ~= 3
mask = cat(3, mask, mask, mask);
end
A = zeros(size(foreground), class(foreground)); %// Change
A(mask) = foreground(mask); %// Assign pixels to foreground
A(~mask) = background(~mask); %// Assign pixels to background
imshow(A);