2016-11-18 1 views
0

接続されたハイライト表示されたポイントの領域を特定するために、特定のポイントが強調表示されているイメージに8接続接続コンポーネントラベリングアルゴリズムを実装しようとしています。オブジェクトの数を見積もってポイントオブジェクトのラベル付けされた接続されたコンポーネント

私のコードは、オブジェクトの量が大量に過大評価されていることを除いて、動作しているようです。たとえば、500点が強調表示されている画像では、

これまでに(アルゴリズムの第1のパスのために)私のコードは次のとおり

public int[][] connectedComp(int[][] array){  // Connected Compoent Labling method 
      int nextlabel = 1;  
      for(int v =y1; v<y1 + height;v++){ 
       for(int u = x1;u<x1 + width;u++){ 
        if(array[v][u]==1){ 
         for (int j=-1; j<=1; j++){ 
          for (int i=-1; i<=1; i++){ 
           if(v+j>=0 && u+i>=0){ 
           if(array[v+j][u+i]>0){ 

            array[v][u]= nextlabel; 
           } 
           else{ 
            array[v][u] = nextlabel++; 
           } 
           } 
          } 
         }  
        } 
       } 
      } 
      return array; 
} 

X1及びY1は、前記ROIの大きさIは、幅と高さに興味がROIの開始座標されています。

誰でもこの原因が考えられますか?

編集

私は、私はすでに訪問し、また、わずかな構造を変更したピクセルを比較するために、自分のコードを変更しました。それは完璧ではないにしても、今はうまくいく。私はあなたの問題はあなたの内側のループであると思い

public int[][] connectedComp(int[][] array){  // Connected Compoent Labling method 
      int nextlabel = 1;  
      for(int v =y1; v<y1 + height;v++){ 
       for(int u = x1;u<x1 + width;u++){ 
        if(array[v][u]==1){ 
         if(v-1>=0 && u-1>=0){ 
          if(array[v-1][u-1]!=0){ 
           array[v][u]= nextlabel; 
          } 
          if(array[v-1][u]!=0){ 
           array[v][u]= nextlabel; 
          } 
          if(array[v-1][u+1]!=0){ 
           array[v][u]= nextlabel; 
          } 
          if(array[v][u-1]!=0){ 
           array[v][u]= nextlabel; 
          } 
          else{ 
           array[v][u] = nextlabel++; 
          } 
         } 
        } 
       }     
      } 
      return array; 
} 

答えて

0

:ここ

が更新されたコードです。

は、あなたがゼロあなたはピクセルがゼロに囲まれているので、ラベルを増やし続ける内部ループすべてのあなたのための

for (int j=-1; j<=1; j++) 
{ 
    for (int i=-1; i<=1; i++) 
    { 
     if(v+j>=0 && u+i>=0) 
     { 
     if(array[v+j][u+i]>0) 
     { 
      array[v][u]= nextlabel; 
     } 
     else{ 
      array[v][u] = nextlabel++; 
     } 
     } 
    } 
} 

に囲まれている単一のピクセルを持っているとしましょう。だから、もしnextlabel = someValueが最後のループの始めにあれば、それはsomeValue + 9と等しくなります。

+0

私はそれを感謝します、nextlabelの値が1だけ増加するピクセルは0で囲まれますか? – MattG

+0

実装しようとしている接続コンポーネントのラベル付けのアルゴリズムがわかりません(1パスまたは2パス(https://en.wikipedia.org/wiki/Connected-component_labeling#Two-pass)に精通)。しかし、最初のパスの2パスアルゴリズムでは、あなたの周りのすべての隣人を見る必要はありませんが、あなたがすでに訪れたものだけにする必要はありません。現在のピクセルと1つ上のもの –

+0

2つのパスメソッドを実装しようとしていますが、私が投稿したコードは最初のパスで試行したものです。少し変更して問題を解決できたと思います。私は編集として私の更新されたコードを投稿します。助けてくれてありがとう! – MattG

関連する問題