我需要融合(叠加)视频中的6个屏幕截图。我正在使用MATLAB来做到这一点。但是,只有最后3张图像清晰显示,而其他图像则显着淡化(见下图)。其他论坛帖子没有处理这个问题:
我正在使用以下代码:
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')
非常感谢任何帮助。
答案 0 :(得分:1)
看起来你有一组图像,其中背景保持固定但是物体在其中移动,你想创建一个复合物,其中物体的每个位置同时显示在一个图像中。
imfuse
功能不是您想要的,正如您所发现的那样。它基本上将每个图像平均为前一个图像。前两个图像被平均,导致对象的两个外观被混合,使得它们以0.5的有效α透明度显示,背景显示。当您在下一个图像中进行平均时,该对象的外观具有0.5的有效Alpha透明度,但之前的两个外观将减半为0.25。这就是第一个对象如此淡化的原因。
您想要做的是掩盖图像中出现差异的区域(即对象出现的位置),并使用这些蒙版将对象覆盖在一个图像中的不同位置。为了做到这一点,您理想地想要一个没有对象的空白图像。如果您没有,则可以从对象图像中生成一个(假设对象对于大多数图像并不处于相同位置)。以下代码适用于grayscale和Truecolor 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);
这就是结果,每个方框都清晰可见(没有混合):
此解决方案的好处是它不需要Image Processing Toolbox。它只是原生的MATLAB代码。