2016-02-10 144 views
0

我有2張圖片。一個是背景圖像,另一個圖像具有相同的背景,但具有一些前景對象。我想從背景中提取前景物體。在matlab中進行簡單的減法運算是不夠的,因爲它會從前景圖像中減去背景圖像的RGB值(如下面的代碼所示)。從matlab中的背景提取前景

im1 = imread('output/frame-1.jpg') 
im2 = imread('output/frame-7.jpg') 

%# subtract 
deltaImage = im1 - im2; 
imshow(deltaImage) 

因此,如果背景顏色是白色前景對象是藍色,然後輸出(即deltaImage)自帶前景對象與橙色彩色與黑色背景。然而我想要的輸出是黑色背景顏色(即原來的顏色)的前景對象。我怎樣才能得到這個?我試圖用下面的代碼來做,但輸出圖像不正確。

im1 = imread('foreground.jpg') 
im2 = imread('background.jpg') 
[m n k]=size(im2); 
deltaImage = zeros(m,n,3); 
fprintf('%d %d %d.\n',m,n,k); 
for l=1:k 
    for i=1:m-1 
     for j=1:n-1 
      if im1(i:j:l)~=im2(i:j:l) 
       deltaImage(i,j,l) = im1(i,j,l); 
      end 
     end 
    end 
end 
imshow(deltaImage) 
  1. 背景圖像

enter image description here

  • 前景圖片
  • enter image description here

  • 輸出圖像(在這裏,我想男人的顏色是藍色)
  • enter image description here

    +0

    如果像素相等,只減去背景圖像? – AnonSubmitter85

    +0

    @hari_OM所以,你喜歡我的答案嗎?任何問題?註釋? –

    回答

    2

    您可以使用deltaImage創建蒙(零和圖像)乘以前景。但是,請注意,您將有與有損圖像壓縮相關的僞影(.jpeg)。如果您使用閾值,如平均差異或所需的特定值,則可以在某種程度上減少。嘗試:

    im1 = double(imread('~/Downloads/foreground.jpg')); 
    im2 = double(imread('~/Downloads/background.jpg')); 
    

    計算3個通道的平均值之差

    deltaImage = mean(im2,3) - mean(im1,3); 
    

    然後通過標準偏差(~3),使用平均值的產品取消下面的行使用特定的閾值,如128

    mask = deltaImage>3*mean(deltaImage(:)); 
    % mask = deltaImage>128;     
    

    然後假設所有原始圖像都在8-BI牛逼格式產生結果也以8位格式:

    result = uint8(cat(3, im1(:,:,1).*mask, im1(:,:,2).*mask, im1(:,:,3).*mask)); 
    imshow(result) 
    

    這是結果,你應該得到:

    output

    再次周圍的主要目的,怪異的像素是假象的有損圖像壓縮(.jpeg),您應該嘗試使用無損像.png格式。

    +0

    我得到的錯誤是**錯誤使用。*整數只能與相同類的整數或標量雙精度組合。**。所以我做了這個改變:'result = double(im1)。* mask;'\t 運行代碼後,我得到這樣的輸出:[work4hari.net78.net/stackoverflow/output1.jpg](http:// work4hari .net78.net/stackoverflow/output1.jpg) –

    +0

    @hari_OM結果很奇怪,有很多壓縮造成的文物。我編輯了答案,希望你會接受它。 –

    +0

    我使用了你的方法,得到的輸出和你所顯示的相似。不過,我嘗試了'.png'格式的方法,但仍然輸出噪音。出現的另一個問題是,當我們做'deltaImage = im1 - im2'時,它們在輸出中沒有噪音。 –