2013-10-20 87 views
1

我已經嘗試了MatLab中的圖像減法,但意識到圖像上有一個很大的藍色補丁。請參閱圖像瞭解更多詳情。在減去MATLAB中的圖像背景後出現藍色補丁

enter image description here 另一張圖片顯示了藍色補丁大致覆蓋的位置。 enter image description here

前2張圖片左側的圖片顯示減法後的圖片。您可以忽略前2張圖片右側的圖片。這是原始圖像之一: enter image description here

這是我減去的背景。 enter image description here

其目的是獲得前景圖像和blob它,然後計算blob的數量,看看有多少書從他們的側面垂直堆疊。我正在試驗blob方法如何在matlab上工作。

有人有什麼想法嗎?以下是我如何執行背景扣除以及顯示它的代碼。謝謝。

[filename, user_canceled] = imgetfile; 
fullFileName=filename; 
rgbImage = imread(fullFileName); 


folder = fullfile('C:\Users\Aaron\Desktop\OPENCV\Book Detection\Sample books'); 
baseFileName = 'background.jpg'; 
fullFileName = fullfile(folder, baseFileName); 

backgroundImage =imread(fullFileName); 
rgbImage= rgbImage - backgroundImage; 

%display foreground image after background substraction%%%%%%%%%%%%%% 

subplot(1,2,1); 
imshow(rgbImage, []); 
+1

圖片有幫助,但代碼現在沒有幫助。你能否更詳細地解釋一下數據來自哪裏? 'rgbImage'是從一個文件讀入的,'backgroundImage'也是如此?這些數據來自哪裏?你是否做過任何形式的健全檢查,以確保問題出現在代碼中而不是數據本身中? – nispio

+0

另外,很可能直接減法不是正確的答案。例如,假設rgb值分別介於0和255之間。如果給定像素的藍色值爲25,並且背景圖像中相應的藍色值爲200,那麼期望的結果是什麼?新的像素值應該是-175?很明顯不是。這很可能是你在這裏看到的。 – nispio

+0

嗨,感謝您關於代碼的建議。我編輯了這個問題以包含更多的代碼。請看一下。我不確定問題出在代碼中還是數據中。我只使用了MatLab大約5天,因此與語法沒有太多相似之處。關於爲什麼我使用直接減法,我發現該方法來自:http://stackoverflow.com/questions/3008326/background-subtracting-in-matlab/3008840#3008840,在該問題中給出的答案之一。 – rockinfresh

回答

1

因爲前景物體(即書)是不透明的,所以背景根本不影響那些像素。換句話說,你正在減去那些不存在的東西。你需要的是一種檢測圖像中哪些像素與前景對應,哪些對應於背景的方法。不幸的是,解決這個問題可能至少和你首先解決的問題一樣困難。

如果你只是想與背景逐像素比較,你可以嘗試這樣的:

thresh = 250; 
imdiff = sum(((rgbImage-backgroundImage).^2),3); 
mask = uint8(imdiff > thresh); 
maskedImage = rgbImage.*cat(3,mask,mask,mask); 
imshow(maskedImage, []); 

你將不得不直到你得到想要的屏蔽玩弄的閾值。你將遇到的問題是背景不適合該任務。例如,如果您在綠屏前準備書籍,您可能會做得更好。

Result image showing books with background removed

+0

謝謝並同意,但如果我們說只有一本薄書,意味着前景只佔圖片的10%到20%,並且有80%的背景,然後在圖像前對圖像進行閾值化處理,它可能不會去在大多數時間我都很喜歡它。因此,減去背景的原因。基本上,當我使用Visual Studio C時,我正在對兩個圖像(一個背景和一個圖書)進行比較,並刪除所有像素。我想知道是否有類似的方法來刪除MatLab中的背景? – rockinfresh

+1

請參閱我的編輯,瞭解您所描述技術的簡單版本。 – nispio

+0

當我嘗試你的方法時,出現以下錯誤。使用repmat時出錯 輸入參數太多。和行中的錯誤,mask = repmat(uint8(imdiff> thresh),1,1,3);我認爲這與repmat的參數有關?我搜索了一下,但我們怎麼知道什麼是最好的最後2參數值? – rockinfresh

1

你得到藍色補丁,因爲你減去兩種顏色的RGB圖像。理想情況下,在差異圖像中,您希望得到背景像素的零點,並且前景像素的點爲非零點。由於您使用的是RGB,所以前景像素最終會產生奇怪的顏色,這並不重要。你所關心的只是差值的絕對值大於0.

順便說一句,你的圖像可能是uint8,它是無符號的。在進行減法之前,您可能需要使用im2double將它們轉換爲雙精度。

+0

謝謝,我把它們轉換成了im2double,並且轉換回了uint8等等,但結果仍然沒有什麼區別,藍色補丁仍然存在,還有其他想法嗎? – rockinfresh

+1

等等,你不需要轉換回uint8,你應該在對象和背景圖像上都使用im2double,然後使用abs(rgbImage - backgroundImage)。 – Dima

+0

Yup。試過了,它給出了稍微不同的結果,但仍然失敗我很想知道,當我使用visual studio C++和opencv,並且使用完全相同的比較方法時,它是成功的,我仍然試圖理解語法以及MatLab是如何工作的。我設法解決它,雖然使用掩碼作爲nispio提到。感謝您的幫助。我非常感謝它(: – rockinfresh