2017-05-19 80 views
1

我需要從視頻中融合(疊加)6個屏幕截圖。我正在使用MATLAB來做到這一點。但是,只有最後3張圖像清晰顯示,而其他圖像明顯淡出(請參閱下圖)。其他的論壇帖子不解決這個問題:如何在MATLAB中融合多個圖像而不會使圖像淡出?

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') 

任何幫助將不勝感激。

+0

With ['imfuse'](http://www.mathworks.com/help/images/ref/imfuse.html),您是否嘗試過其他'method'和'scaling'選項? – kedarps

+0

是的,我做了,但沒有任何工作 – lukecam95

回答

1

看起來您有一組圖像,其中背景保持固定,但對象在其中移動,並且您希望創建一個組合,其中對象的每個位置都同時顯示在一個圖像中。

imfuse函數不是你想要的,就像你發現的那樣。它基本上將每個圖像平均到以前的圖像。前兩個圖像被平均,導致對象的兩個外觀被混合,使得它們以每個0.5的有效alpha透明度顯示,並且背景顯示爲透過。當您在下一張圖片中取平均值時,該對象的外觀具有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代碼。

+0

然而,要做到這一點,我需要以某種方式找到不同圖像中像素的所有位置和值,然後使用您的方法覆蓋圖像? – lukecam95

+1

@ lukecam95:這就是上面的代碼爲你做的。如果像上面那樣將圖像收集到變量'imgSet'中,那麼運行上面的代碼將創建差異的二進制蒙版,並將所有內容拼合在一起。 – gnovice