2

私は、IRで動作するように変換されたウェブカメラでキャプチャされた人間の拳の次のIR(赤外線)画像を持っています。写真は皮膚の下の静脈を捉えています。私がやりたいのは、拳を保持し、周囲の黒い領域を取り除くことです。これをMATLABで行うにはどうすればよいですか?

ここに画像の説明を入力してください

これが私がこれまでに行ったことですが、私はこれのために黒い画像を取得しています

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);

誰かが私が間違っていることを教えてもらえますか、そして私が望むことをどのように達成することができますか?また、背景を取り除きたい場合は、黒い背景ではなく白い背景が必要です> Cosこのプロジェクトの目的は、静脈だけを保持することであり、静脈は黒として保持されます。次に、これらのポイントの座標を取得します。したがって、背景も座標として生成されたくありません...!だから私は背景を白にしたい..!これを行う方法 ?

4

2 に答える 2

3

あなたがやりたいことはセグメンテーションと呼ばれ、画像処理の大きなトピックです。あなたの画像はとても素敵なので、画像処理ツールボックスがあれば、これはとても簡単です。そして、あなたがそれでもそれほど難しくなくても。

クリスが述べているように、画像を使用する前に、画像を2倍に変換する必要があります。画像処理ツールボックスがある場合は、関数graythreshを使用して最適なしきい値レベルを見つけることができます。しきい値処理を行うためにforループを使用する必要はないことに注意してください。MATLABでは、行列全体を1行でしきい値処理できます。

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

セグメント化された画像

これにより、拳の値が1で背景ラベルが0のバイナリイメージが得られます。拳をそのまま維持するために、バイナリバージョンに元のバージョンを掛けます。これで、背景はすべてゼロになり、拳は元の値を保持します。

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

拳

画像処理ツールボックスがない場合は、しきい値レベルを手動で選択する必要があります。これは少し注意が必要です。0.06を使用しましたが、graythreshは0.2980が最適であることを示しています。しきい値を見つける良い方法は、画像のヒストグラムを調べることです。

hist(b(:),256);

ヒストグラム

ヒストグラムから、ポイントのクラスターが2つあり、2から3の間の任意の値でクラスターがかなりうまく分離されていることがはっきりとわかります。したがって、しきい値処理を行うには、その間隔の値を使用する必要があります。

于 2011-04-23T12:23:14.200 に答える
1

私が見るいくつかの問題:

コードでは、ループカウンターとしてgとfを使用しますが、常にb(j、k)としてb配列にアクセスします。

同様に、imreadはuint8を読み取るため、これをdouble(0.06)と実際に比較することはできません。したがって、次の方法でダブルに変換します。

b=im2double(b);

また、この場合は大したことではありませんが、ループの反復ごとに動的に成長します。画像が大きい場合、コードのパフォーマンスが大幅に低下します。割り当てごとに:

c=ones(j,k);

これらの変更の後、それはあなたの拳に似た何かを生み出します。ただし、背景が均一な色ではないため、あまりうまく機能しません。この部分は私の経験の範囲外です...

于 2011-04-22T20:03:15.607 に答える