6

グレースケール画像の正しいセグメンテーションを達成するのに問題があります:

分割する画像

グラウンド トゥルース、つまり、セグメンテーションを次のように表示したいのですが、これは次のとおりです。

グラウンド トゥルース

私が最も興味を持っているのは、円内の 3 つのコンポーネントです。ご覧のとおり、上の画像を 3 つのコンポーネントに分割したいと思います。2 つの半円と、それらの間の長方形です。

膨張、浸食、再構成のさまざまな組み合わせ、および k-means、isodata、ガウスの混合などのさまざまなクラスタリング アルゴリズムを試しましたが、成功の度合いはすべてさまざまでした。

任意の提案をいただければ幸いです。

編集:これが私が得た最高の結果です。これは、アクティブな輪郭を使用して円形の ROI をセグメント化し、次に isodata クラスタリングを適用して取得されました。

クラスター

これには 2 つの問題があります。

  • 左上のクラスターに属する、右下のクラスターの周りの白いハロー
  • 中央のクラスターに属する、右上と左下の両方のクラスターの周りの灰色の光輪。
4

2 に答える 2

7

これがスターターです...円形のハフ変換を使用して円形の部分を見つけます。そのために、最初に画像をローカルでしきい値設定します

 im=rgb2gray(imread('Ly7C8.png'));
 imbw = thresholdLocally(im,[2 2]); % thresold localy with a 2x2 window
 % preparing to find the circle
 props = regionprops(imbw,'Area','PixelIdxList','MajorAxisLength','MinorAxisLength');
 [~,indexOfMax] = max([props.Area]);
 approximateRadius =  props(indexOfMax).MajorAxisLength/2;
 radius=round(approximateRadius);%-1:approximateRadius+1);
 %find the circle using Hough trans.
 h = circle_hough(edge(imbw), radius,'same');
 [~,maxIndex] = max(h(:));
 [i,j,k] = ind2sub(size(h), maxIndex);
 center.x = j;     center.y = i;

 figure;imagesc(im);imellipse(gca,[center.x-radius  center.y-radius 2*radius 2*radius]);
 title('Finding the circle using Hough Trans.');

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

円の内側にあるものだけを選択します。

 [y,x] = meshgrid(1:size(im,2),1:size(im,1));
 z = (x-j).^2+(y-i).^2;
 f = (z<=radius^2);
 im=im.*uint8(f);

編集:

ヒストグラムを見て、最初の極大値を見つけ、そこからbwlabelを使用して、2つの別々のセグメントが見つかるまで反復することにより、画像のしきい値を開始する場所を探します。

  p=hist(im(im>0),1:255);
  p=smooth(p,5);
  [pks,locs] = findpeaks(p);

  bw=bwlabel(im>locs(1));
  i=0;
  while numel(unique(bw))<3
     bw=bwlabel(im>locs(1)+i); 
     i=i+1;
  end


 imagesc(bw);

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

これで、円から2つのラベルの付いた部分を取り出すことで中央部分を取得でき、残っているのは中央部分(+ハローの一部)になります。

 bw2=(bw<1.*f);

しかし、いくつかの中央値フィルタリングの後、より合理的なものが得られます

 bw2= medfilt2(medfilt2(bw2));

そして一緒に私たちは得る:

 imagesc(bw+3*bw2); 

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

最後の部分は本当の「迅速で汚い」です、私はあなたがすでに使用したツールであなたがより良い結果を得ると確信しています...

于 2012-11-15T22:59:29.403 に答える
1

流域変換を使用して近似結果を取得することもできます。これは、反転した画像の流域です -> watershed(255-I) 結果の例を次に示します。

ここに画像の説明を入力

もう 1 つの簡単な方法は、ディスク構造要素を使用して元の画像に対して形態学的クロージングを実行し (粒度測定のマルチスケール クロージングを実行できます)、完全な円を取得することです。この後、円とコンポーネントの抽出がより簡単になります。

se = strel('disk',3);
Iclo = imclose(I, se);% This closes open circular cells.
Ithresh = Iclo>170;% one can locate this threshold automatically by histogram modes (if you know apriori your cell structure.)
Icircle = bwareaopen(Ithresh, 50); %to remove small noise components in the bg

ここに画像の説明を入力

Ithresh2 = I>185; % This again needs a simple histogram.

ここに画像の説明を入力

于 2014-01-06T01:32:06.033 に答える