- ベストアンサー
ラベリング処理とは?
- ラベリング処理とは、画像処理の一手法であり、2値化された画像の中で連結し合う同一色の領域にラベルを付ける処理です。
- 255の画素を同じ番号でラベル付けし、異なるラベル番号の255の島(塊)の数を数えることができます。
- さらに、画素数の小さな島を除去することも可能です。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
どこがまずいというより、一目だめな感じです。ループではなく再帰を使うところがミソなんです。 int aaa(int x, int y, int n)のアルゴリズムは単純で、 ・その点が島の条件を満たしていなければ、処理終了。return 0 ・そうでない場合は、その点を島に加え、周囲の4点で再帰的に aaa()を呼び出し、処理終了。return (周囲4点の戻り+1)
その他の回答 (1)
- moritan2
- ベストアンサー率25% (168/670)
画像のデータを int a[V_SIZE][H_SIZE]; とします。 ワークとして処理済みであることと、島番号を表す、これと同じサイズの配列を使います。 int b[V_SIZE][H_SIZE]; これはあらかじめクリアしておきます。 a[y][x]値が255で、b[y][x]が未処理の場所を見つけます。そこから、次のように再起的に島を探せます。 int aaa(int x, int y, int n) { int ans; if(x < 0 || x >= H_SIZE || y < 0 || y >= V_SIZE) { return 0; } if(a[y][x] != 255 || b[y][x] != 0) { return 0; } ans = 1; b[y][x] = n; ans += aaa(x, y + 1, n); ans += aaa(x, y - 1, n); ans += aaa(x + 1, y, n); ans += aaa(x - 1, y, n); return ans; } 返ってきた値が画素数なので3より大きい時だけ島リストに入れるようにすればいいでしょう。
補足
早速の御返信ありがとうございます。 大変参考になりました。 ご指導いただいた後、自分なりに考えてみたのですが、以下のプログラムでは同じようにできますでしょうか? なかなかうまくいかず、どこか間違ってるような気がして・・・ 画像データ unsigned char a[V_SIZE][H_SIZE] 同じサイズの配列 unsigned char b[V_SIZE][H_SIZE] nは島の数です。 for (y=0; y<V_SIZE; y++){ for (x=0; x<H_SIZE; x++){ if(a[y][x] == 255){ if (y-1 < 0) y-1 = 0; if (y+1 > V_SIZE-1) y+1 = V_SIZE-1; if (x-1 < 0) x-1 = 0; if (x+1 > H_SIZE-1) x+1 = H_SIZE-1; if (b[y][x+1] != 0) b[y][x] = b[y][x+1]; else if(b[y-1][x] !=0) b[y][x] = b[y-1][x]; else if(b[y][x-1] !=0) b[y][x] = b[y][x-1]; else if(b[y+1][x] !=0) b[y][x] = b[y+1][x]; else{ b[y][x] = n; n++; } }
お礼
ご指導ありがとうございます。 なるほど。やはり再帰関数がミソなのですね。 もう少し勉強を進めてみます。