Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Image 带遮罩的图像融合_Image_Matlab_Image Processing_Matrix_Indexing - Fatal编程技术网

Image 带遮罩的图像融合

Image 带遮罩的图像融合,image,matlab,image-processing,matrix,indexing,Image,Matlab,Image Processing,Matrix,Indexing,我正试图结合两个图像的基础上的信息从面具。如果遮罩为0,则使用背景图像的颜色信息;如果遮罩为1,则使用前景图像的颜色信息。因为面具和两者 图像大小相同,我想使用矩阵的逻辑索引来实现这一点 我的尝试: mask = imread('mask.png'); foreground = imread('fg.jpg'); background = imread('bg.jpg'); [r,c,~]=size(mask); A = zeros(size(mask)); for i=1:r f

我正试图结合两个图像的基础上的信息从面具。如果遮罩为0,则使用背景图像的颜色信息;如果遮罩为1,则使用前景图像的颜色信息。因为面具和两者
图像大小相同,我想使用矩阵的逻辑索引来实现这一点

我的尝试:

mask = imread('mask.png');
foreground = imread('fg.jpg');
background = imread('bg.jpg');
[r,c,~]=size(mask);
A = zeros(size(mask));

for i=1:r    
  for j=1:c        
    if mask(i,j) == 0
        A(i,j,:) = background(i,j,:);
    end
    if mask(i,j) > 0
        A(i,j,:) = foreground(i,j,:);
    end       
  end
end

imshow(A);

结果看起来像一个闪烁的蓝色图像,但我不想这样。请帮助。

您可以更简洁地执行此操作:

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的解决方案。

您的代码有两个问题。第一个问题是,您试图将彩色像素分配给输出图像
A
,但此图像仅是二维的。您希望图像具有三个通道,而不是两个通道。此外,指定的输出图像类型错误。默认情况下,输出图像
A
的类型为
double
,但您将不是
double
的值复制到其中。。。最可能是无符号8位整数

因此,将图像强制转换为与输入图像相同的类型。假设两个输入图像的类型相同,则初始化
A
,以便:

A = zeros(size(foreground), class(foreground));
这将正确地生成与任何输入类型相同的彩色图像,假设它们都是相同的类型

现在,您的
for
循环很好,但是如果您使用
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);

我想使用逻辑索引可能比我现在的速度快很多:)。哈哈,完全忽略了图像不是黑白的:D@lhcgeneva:D老实说,在我更全面地阅读代码之前,我几乎也忘了。