2011-04-22 277 views
2

我有以下紅外(紅外)圖像捕捉到一個webcamera轉換爲紅外工作捕捉的人類拳頭。照片捕獲了皮膚下的靜脈。我想要做的就是保留拳頭,擺脫周圍的黑色區域。我如何在MATLAB中做到這一點?Matlab:如何消除黑色背景並保留圖像中的感興趣區域?

enter image description here

這是我迄今所做的,但我剛開黑色圖像此

a=imread('1.jpg'); 
figure; imshow(a); 
b=rgb2gray(a); 
figure; 
imshow(b); 
[j,k]=size(b); 
for g=1:j 
for f=1:k 
if b(j,k)>0.06 
c(j,k)=0; 
else c(j,k)=1; 
end 
end 
end 
figure,imshow(c); 

有人能告訴我我在做什麼錯誤,以及如何我能完成我想要的東西?另外當我的意思是我想擺脫背景我的意思是我想要一個白色的背景,而不是黑色的>因爲這個項目的目的是保留只是靜脈,靜脈將保留爲黑色。然後我將採取這些點的座標。所以我不想要背景作爲座標來生成......!所以我想要背景爲白色..!這個怎麼做 ?

回答

3

你想要做的事叫做segmentation,是圖像處理中的一個大問題。你的圖像相當不錯,所以如果你有圖像處理工具箱,這很容易。即使你不那麼努力。

正如克里斯提到的那樣,在做任何事情之前,您應該將圖像轉換爲雙倍圖像。如果您有圖像處理工具箱,則可以使用功能graythresh查找最佳閾值級別。請注意,您不需要使用for循環來進行閾值處理,在MATLAB中,您可以將整個矩陣限定在一行中。

b = im2double(b);    %convert to double 
thresh_level = graythresh(b); %find best threshold level 
c = b > thresh_level;   %do thresholding 
imshow(c) 

segmented image

這給你一個二進制圖像,在你的拳頭的值爲1,背景標籤0。爲了保持拳頭,因爲它是我們乘以原始版本的二進制版本。現在背景全部爲零,拳頭保持原有的價值。

d = im2double(c).*b;   %c is binary, so we need to convert it first 
imshow(d,[]) 

fist

如果你沒有,你需要手動選擇的閾值水平的圖像處理工具箱。這可能有點棘手。你使用0.06,但是graythresh表明0.2980是最好的。我發現找到閾值的好方法是查看圖像的直方圖。

hist(b(:),256); 

histogram

我們可以清楚地從我們分兩個組柱狀圖,而且任何價值和3間2將會分離羣相當不錯看。所以我們應該使用該時間間隔中的值來進行閾值處理。

+0

海甚至我試了一個長的代碼,並得到了類似的圖像: – khadeejah 2011-04-23 17:57:37

+0

@khadeejah :我認爲這回答了你的問題,如果它對你有幫助,你應該接受它。 – 2011-04-24 15:41:21

+0

@doob ...如何接受答案?請幫助我?:( – khadeejah 2011-04-24 17:21:35

1

一對夫婦的問題,我看到:

在你的代碼使用G和F循環計數器,但你總是訪問B排列爲B(J,K)。

此外,imread讀取uint8,因此您無法將其與double(0.06)進行比較。因此,通過轉換爲雙:

b=im2double(b); 

而且,不是什麼大不了的事在這種情況下,但你動態地擴展c各自循環迭代。如果圖像很大,這會極大地妨礙代碼的性能。通過分配它:

c=ones(j,k); 

經過這些更改後,它會產生類似於你的拳頭。但是,由於背景不是統一的顏色,所以不能很好地工作。這部分是在我的經驗範圍之外...

+0

bt我想讓手掌保持原樣。在這裏hwatever你已經說過它變成了黑色.. :(所以現在要做什麼.. :( – khadeejah 2011-04-23 08:55:11

+0

這就是你的代碼所做的。使用Gjaul的答案,它更好。我沒有圖像分析經驗,所以我所能做的就是修復 – Chris 2011-04-23 22:42:31

+0

他他@chris ..感謝這麼多!:D yea ghauls真的做了這件事..!:D – khadeejah 2011-04-24 17:24:10

相關問題