看起來您有一組圖像,其中背景保持固定,但對象在其中移動,並且您希望創建一個組合,其中對象的每個位置都同時顯示在一個圖像中。
imfuse
函數不是你想要的,就像你發現的那樣。它基本上將每個圖像平均到以前的圖像。前兩個圖像被平均,導致對象的兩個外觀被混合,使得它們以每個0.5的有效alpha透明度顯示,並且背景顯示爲透過。當您在下一張圖片中取平均值時,該對象的外觀具有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代碼。
With ['imfuse'](http://www.mathworks.com/help/images/ref/imfuse.html),您是否嘗試過其他'method'和'scaling'選項? – kedarps
是的,我做了,但沒有任何工作 – lukecam95