如何在没有图像淡出的情况下在MATLAB中融合多个图像?

时间:2017-05-19 13:51:13

标签: matlab image-processing

我需要融合(叠加)视频中的6个屏幕截图。我正在使用MATLAB来做到这一点。但是,只有最后3张图像清晰显示,而其他图像则显着淡化(见下图)。其他论坛帖子没有处理这个问题:

enter image description here

我正在使用以下代码:

A = imread('1.jpg'); 
for idx = 2:1:6
    B = imread([num2str(idx) '.jpg']); % Read in the next image
    A = imfuse(A, B, 'blend', 'Scaling', 'joint'); % Fuse and store into A
end
imshow(A)
imwrite(A, 'output.jpg')

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

看起来你有一组图像,其中背景保持固定但是物体在其中移动,你想创建一个复合物,其中物体的每个位置同时显示在一个图像中。

imfuse功能不是您想要的,正如您所发现的那样。它基本上将每个图像平均为前一个图像。前两个图像被平均,导致对象的两个外观被混合,使得它们以0.5的有效α透明度显示,背景显示。当您在下一个图像中进行平均时,该对象的外观具有0.5的有效Alpha透明度,但之前的两个外观将减半为0.25。这就是第一个对象如此淡化的原因。

您想要做的是掩盖图像中出现差异的区域(即对象出现的位置),并使用这些蒙版将对象覆盖在一个图像中的不同位置。为了做到这一点,您理想地想要一个没有对象的空白图像。如果您没有,则可以从对象图像中生成一个(假设对象对于大多数图像并不处于相同位置)。以下代码适用于grayscaleTruecolor RGB图片。

我将首先生成一组示例图像:默认MATLAB cameraman.tif图像的四个副本,每个图像在每个角落都有一个不同颜色的框:

img = imread('cameraman.tif');        % Load the image
imgSet = cat(4, img, img, img, img);  % Concatenate 4 copies of the image
imgSet(20:40, 20:40, :, 1) = 255;     % White box in the upper left
imgSet(20:40, 216:236, :, 2) = 0;     % Black box in the upper right
imgSet(216:236, 20:40, :, 3) = 127;   % Gray box in the lower left
imgSet(216:236, 216:236, :, 4) = randi(255, [21 21], 'uint8');  % Random values in the
                                                                %   lower right

我们可以使用mode功能从中生成空白图像(即重建原始图像):

blankImage = mode(imgSet, 4);

这里是通过对空白图像进行差异来掩盖每个图像的代码,然后提取每个蒙版区域并将其添加到最终的合成图像中:

sumImage = imgSet(:, :, :, 1);
for iImage = 2:size(imgSet, 4),
  temp = imgSet(:, :, :, iImage);
  mask = repmat(any((blankImage ~= temp), 3), [1 1 size(blankImage, 3)]);
  sumImage(mask) = temp(mask);
end
imshow(sumImage);

这就是结果,每个方框都清晰可​​见(没有混合):

enter image description here

此解决方案的好处是它不需要Image Processing Toolbox。它只是原生的MATLAB代码。