2016-08-22 9 views
0

私は核に触れることを試みるために流域アルゴリズムを使用しています。 enter image description here またはこの:一般的なイメージは次のようになります。私はこのコードで流域アルゴリズムを適用しようとしているenter image description here黒い画像につながるWatershedアルゴリズムの負の値

:画像全体が暗くなる

show(RGB_img) 


%Convert to grayscale image 
I = rgb2gray(RGB_img); 

%Take structuring element of a disk of size 10, for the morphological transformations 
%Attempt to subtract the background from the image: top hat is the 
%subtraction of the open image from the original 


%Morphological transformation to subtract background noise from the image 
%Tophat is the subtraction of an opened image from the original. Remove all 
%images smaller than the structuring element of 10 
I1 = imtophat(I, strel('disk', 10)); 

%Increases contrast 
I2 = imadjust(I1); 
%show(I2,'contrast') 
%Assume we have background and foreground and assess thresh as such 
level = graythresh(I2); 
%Convert to binary image based on graythreshold 
BW = im2bw(I2,level); 
show(BW,'C'); 



BW = bwareaopen(BW,8); 
show(BW,'C2'); 

BW = bwdist(BW) <= 1; 
show(BW,'joined'); 
%Complement because we want image to be black and background white 
C = ~BW; 
%Use distance tranform to find nearest nonzero values from every pixel 
D = -bwdist(C); 

%Assign Minus infinity values to the values of C inside of the D image 
% Modify the image so that the background pixels and the extended maxima 
% pixels are forced to be the only local minima in the image (So you could 
% hypothetically fill in water on the image 

D(C) = -Inf; 

%Gets 0 for all watershed lines and integers for each object (basins) 
L = watershed(D); 
show(L,'L'); 

%Takes the labels and converts to an RGB (Using hot colormap) 
fin = label2rgb(L,'hot','w'); 

% show(fin,'fin'); 
im = I; 

%Superimpose ridgelines,L has all of them as 0 -> so mark these as 0(black) 
im(L==0)=0; 

clean_img = L; 
show(clean_img) 

C = ~BW;後。画像のピクセルはすべて-infか、それより小さい負の数になっているからです。これはこれを回避する方法です。もしそうなら、私のコードでこのアルゴリズムを動作させるために何を変更することができますか?私は1トンを実験しましたが、何が起こっているのか分かりません。どんな助けも素晴らしいだろう!

+0

'show'コマンドは何をしますか?私はそれを認識しません。それは2016aのことですか? –

+0

@tasosPapastylianouショーは、私が書いた小さな機能です。実際には、「figure」、「imshow」をカプセル化し、図にラベルを追加するだけです。 'imshow'と同じディスプレイでなければなりません – Sam

答えて

2

問題は、あなたのshowコマンドです。あなたがコメントで言ったように、これはフードの下にimshowを使用します。 imshowを直接試してみると、黒い画像も表示されます。ただし、適切な制限をつけて電話すると、次のように表示されます。

imshow(clean_img,[min(clean_img(:)), max(clean_img(:))]) 

一般的に、私は通常この理由からimagescを好んでいます。 imshowは、どの範囲を表現するかについて任意の判断を下します。通常、私はそれに追いついていません。あなたの場合、あなたの最終イメージはuint16だと思うので、imshowは範囲[1, 65025]を表すことを選択します。すべてのピクセル値が400未満であるため、その範囲の肉眼では黒く見えます。

+1

' imshow(clean_img、[]); 'を実行するだけで、自動的に最小値と最大値が計算され、' [0,1] 'にスケールされます。 – rayryeng

+0

ありがとう、これは助けました。 (I_eq_c = imcomplement(I_eq);)と 'I_mod = imimposemin(I_eq_c、〜bw4 | mask_em);の後ろに' L = watershed(I_mod);という別のアルゴリズムを使用しています。 'L'の後、画像のピクセルはすべて1に設定されます。したがって、再びすべて黒です。 – Sam

+0

また、これらをセグメント化するより汎用的な方法がありますか?チュートリアルのコードがちょうど複雑なイメージとして使われていても、私は結果がまったく見つからなかったようです。 – Sam

関連する問題