次のような静脈画像があります。流域アルゴリズムを使用して、静脈の骨格を抽出します。
私のコード:(Kは元の画像です)。
level = graythresh(K);
BW = im2bw(K,level);
D = bwdist(~BW);
DL = watershed(D);
bgm = DL == 0;
imshow(bgm);
結果は次のとおりです。
ご覧のとおり、多くの情報が失われています。誰かが私を助けることができますか?ありがとう。
次のような静脈画像があります。流域アルゴリズムを使用して、静脈の骨格を抽出します。
私のコード:(Kは元の画像です)。
level = graythresh(K);
BW = im2bw(K,level);
D = bwdist(~BW);
DL = watershed(D);
bgm = DL == 0;
imshow(bgm);
結果は次のとおりです。
ご覧のとおり、多くの情報が失われています。誰かが私を助けることができますか?ありがとう。
照明がやや不均一に見えます。これは、特定の形態学的操作を使用して修正できます。基本的な考え方は、不均一な照明だけを表す画像を計算して減算するか、それで除算することです(これによりコントラストも向上します)。照明だけを見つけたいので、十分な大きさの構造化要素を使用することが重要です。これにより、操作ではローカルプロパティではなくグローバルプロパティを調べることができます。
%# Load image and convert to [0,1].
A = im2double(imread('http://i.stack.imgur.com/TQp1i.png'));
%# Any large (relative to objects) structuring element will do.
%# Try sizes up to about half of the image size.
se = strel('square',32);
%# Removes uneven lighting and enhances contrast.
B = imdivide(A,imclose(A,se));
%# Otsu's method works well now.
C = B > graythresh(B);
D = bwdist(~C);
DL = watershed(D);
imshow(DL==0);
これがC
(左)、プラスDL==0
(中央)、および元の画像へのオーバーレイです。
im2bw
を適用すると、基本的にuint8
、ピクセルの明るさがからの値をとるintmin('uint8')==0
画像intmax('uint8')==255
をバイナリ画像(logical
値のみが使用される)に変換するため、情報が失われます。これはあなたが観察した情報の損失を伴うものです。画像を表示すると、しきい値を超える値を持つBW
すべての要素が1になり、しきい値を下回る要素は0になります。K
level
はい、しきい値を下げる必要があります(大津の方法で得られるしきい値よりも低くする必要があります)。また、しきい値を下げたときにエッジマップにノイズが多い場合は、しきい値を下げる前に2Dガウス平滑化フィルターを適用する必要があります。これにより、エッジがわずかに移動しますが、ノイズもクリーンアップされるため、トレードオフになります。
2Dガウス関数は、次のような方法で適用できます。
w=gausswin(N,Alpha) % you'll have to play with N and alpha
K = imfilter(K,w,'same','symmetric'); % something like these options
残りのアルゴリズムを適用する前に。