接続されたハイライト表示されたポイントの領域を特定するために、特定のポイントが強調表示されているイメージに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;
}
私はそれを感謝します、nextlabelの値が1だけ増加するピクセルは0で囲まれますか? – MattG
実装しようとしている接続コンポーネントのラベル付けのアルゴリズムがわかりません(1パスまたは2パス(https://en.wikipedia.org/wiki/Connected-component_labeling#Two-pass)に精通)。しかし、最初のパスの2パスアルゴリズムでは、あなたの周りのすべての隣人を見る必要はありませんが、あなたがすでに訪れたものだけにする必要はありません。現在のピクセルと1つ上のもの –
2つのパスメソッドを実装しようとしていますが、私が投稿したコードは最初のパスで試行したものです。少し変更して問題を解決できたと思います。私は編集として私の更新されたコードを投稿します。助けてくれてありがとう! – MattG