2014-06-10 166 views
1

我想從對象的圖片中減去背景以僅留下前景對象。我已經使用imshow()發現背景的RGB值爲218 220 219。我如何使用imsubtract()的RGB值?使用imsubtract(線55) X和Y從圖像中減去背景

y = [218 220 219]; 
z = imsubtract(img,y); 

錯誤必須具有相同的尺寸和類,或Y必須是標量加倍。

PencilCase

+1

您的img是一個'mxnx3'矩陣。 3個組件對應紅藍綠色。你的'y'也在這些組件中。你想要的是減去'img(:,:,1)-218'等等。 –

+0

@TheMinion也許我的想法是錯誤的,但使用你的建議只留下一個沒有顏色的圖像[220 220 220]。 – Jak

回答

4

您可以使用

z = bsxfun(@minus, img, permute([218 220 219], [1 3 2])); 

你需要注意的數據類型和範圍。如果img的類型爲uint8,則像素值將在範圍0..255之間,但難以減去值,因爲您會看到結果在0處下溢: ...
因此,您可能需要將imgdouble使用im2double,其像素值範圍在0..1。在這種情況下,您必須將「灰色」矢量[2218 220 219]轉換爲0..1範圍除以255
所以,一個更完整的解決方案將是

z = bsxfun(@minus, im2double(img), permute([218 220 219]/255, [1 3 2])); 
+2

你也應該注意否定。減法後的值 –

+0

+1很好的解釋 –

+0

@Shai我繼續得到一個黑色的圖像... – Jak

-1

下最終得到我更接近我一直在尋找的答案,但沒有你的指導!

img = imread('IMG_0792.jpg'); 
img = im2double(img); 

rows = numel(img(:,1,1)); 
columns = numel(img(1,:,1)); 

for i = 1:rows 
    for j = 1:columns 
     if ((img(i,j,1) > 0.75) && (img(i,j,2) > 0.7) && (img(i,j,3) > 0.7)) 
      img(i,j,1) = 1; 
      img(i,j,2) = 1; 
      img(i,j,3) = 1; 
     end 
    end 
end 

imshow(img); 
+0

-1 www.mathworks.com/help/matlab/ref/size.html)。 (b)在Matlab中使用['i'和'j'作爲變量](http://stackoverflow.com/q/14790740/1714410)和(c)使用嵌套循環代替[tag:bsxfun]。 – Shai