プロが教える店舗&オフィスのセキュリティ対策術

はじめまして!大学で画像処理について学び始めたものですが、
ラベリング処理でわからないことがあり、質問させていただきました!
二値化はなんとかできたのですが・・・
下記のようにラベルをつけるにはどうしたらよろしいでしょうか??


画素数
○⇒255
●⇒0

一○○○○○○○○○
行○○○○●○○○○⇒左から順に●に1、2、3、とつけたい
目○●○○○○○●○
 ○○○○○○○○○
 ○○○○○○○○○
 ○○○○○○○○○
二○○○○○○○●○
行○●○○●○○○○⇒左から順に●に11、12、13とつけたい
目○○○○○○○○○
 ○○○○○○○○○
 ○○○○○○○○○
※●は横一列ですが上記のように一番右の●の座標が上だったりするなど縦にずれていてラベリングがうまく走査できません。。。この図だと縦に一列ですが、実際は横にも画素がずれています。。。。

最終的には、このようにラベリングして
一○○○○○○○○○
行○○○○2○○○○
目○1○○○○○3○
 ○○○○○○○○○
 ○○○○○○○○○
 ○○○○○○○○○
二○○○○○○○13○
行○11○○12○○○○
目○○○○○○○○○
 ○○○○○○○○○
 ○○○○○○○○○

1と11 2と12 3と13の距離を測りたいと思っています・・・なのですが、この際ラベリングを走査すると
一行目の「1」とつけたい画素に「2」がついてしまったり、
二行目の「3」とつけたい画素に「1」がついてしまいます。。

そこでラベリングを、コンビニのスキャナーのように
4つの画素分ぐらいで横に走査できるようにできないか、
と考えたのですが、参考書などを調べたのですが
そのようなラベリングは見つからず、
うずまきラベリングや
4近傍ラベリングは見つけたのですが、
うまくラベルをつけることができませんでした。
うずまきラベリングは一行目の横画素に到達するまえに
上下の画素に触れてしまいラベリングできませんでした。
4近傍ラベリングは通常のラベリングと同じような結果になってしまいました。

もしどなたか、このようなラベリング方法を知っている方など
いましたらご教授お願いします!!
説明不足、意味がよくわからないところなどありましたらご指摘お願いします
よろしくお願いします(><)

A 回答 (5件)

「一行目」とか「二行目」の意味が分からん. どこが一行目でどこが二行目なのか.


でもって, 単純に「左から右にスキャンする」だけじゃダメなの?

この回答への補足

早速返信ありがとうございます。
わかりずらく、すいません;
一行目と二行目は気にしないでください。
☆開始で左から右にスキャンしていくと
⇒⇒⇒
☆⇒⇒⇒⇒⇒⇒⇒⇒
⇒⇒⇒⇒1○○○○
○2○○○○○3○
○○○○○○○○○
○○○○○○○○○
○○○○○○○○○
○○○○○○○11○
○12○○13○○○○
○○○○○○○○○
○○○○○○○○○
○○○○○○○○○
のようにラベルが思ったようにつかないのです。。

補足日時:2009/01/27 16:35
    • good
    • 0

「行」の意味が分からないのはNo.1氏と同じなんだけど、


>画素数
>○⇒255
>●⇒0
もわからない。
これが、二次元配列(行を含めると三次元?)に入った内容なのかもあいまい。
少なくとも、
「理想」と「現実」にギャップがあるのであれば、まずソースの提示。

この回答への補足

不勉強ですいません!
まず、二次元配列です。x、y軸にして座標をテキスト出力する予定です。

●⇒0
○⇒255
の数字は輝度値です。なのでただの画素の集合と思っていただいて大丈夫だと思います。

行の意味は
質問で記述したのをアップすると
○○○○○○○○○○○○○
○●○●○●○●○●○●○
○○○○○○○○○○○○○
○●○●○●○●○●○●○
○○○○○○○○○○○○○
このように画素が横に並んだように見えるので
(実際には上下左右に若干乱れています。)
一行目と
二行目に分けさせていただきました;自分視点で書いてしまいすいません・・
その不ぞろいに並んでいる左から右に画素を1,2,3・・・と
順番をラベリングしたいと思っているんですが・・・
ソースなのですが今ソースが手元にありませんので明日にはUPさせてもらいます・・・

補足日時:2009/01/27 17:22
    • good
    • 0

と言う事は、以下のようになっている事がある訳だな?


  ○○○○○○○○○○○○○○○○○○○○○○○○○○○
一○○○○●○○○○○○○○○○○●○○●○○○○○○○
行○●○○○○○●○○●○○●○○○○○●○○●○○●○
目○○○○○○○○○○●○○○○○○○○○○○○○○○○
  ○○○○○○○○○○○○○○○○○○○○○○○○○○○
  ○○○○○○○○○○○○○○○○○○○○○○○○○○○
二○○○○○○○●○○●○○○○○○○○○○○○○○○○
行○●○○●○○○○○○○○●○○●○○○○○●○○●○
目○○○○○○○○○○○○○○○○●○○●○○○○○○○
  ○○○○○○○○○○○○○○○○○○○○○○○○○○○
  ○○○○○○○○○○○○○○○○○○○○○○○○○○○


  ○○○○○○○○○○○○○○○○○○○○○○○○○○○
一○○○○ 2○○○○○○○○○○○ 6○○ 7○○○○○○○
行○ 1○○○○○ 3○○ 4○○ 5○○○○○ 7○○ 8○○ 9○
目○○○○○○○○○○ 4○○○○○○○○○○○○○○○○
  ○○○○○○○○○○○○○○○○○○○○○○○○○○○
  ○○○○○○○○○○○○○○○○○○○○○○○○○○○
二○○○○○○○13○○14○○○○○○○○○○○○○○○○
行○11○○12○○○○○○○○15○○16○○○○○18○○19○
目○○○○○○○○○○○○○○○○16○○17○○○○○○○
  ○○○○○○○○○○○○○○○○○○○○○○○○○○○
  ○○○○○○○○○○○○○○○○○○○○○○○○○○○
と「ラベル」を付けたいと。

だったら
一○○○○●○○○○○○○○○○○●○○●○○○○○○○
行○●○○○○○●○○●○○●○○○○○●○○●○○●○
目○○○○○○○○○○●○○○○○○○○○○○○○○○○
の3ラインを、左から同時に見ていくしかない。3個ペアになった「3個縦1列」に「1個以上の黒い画素」があったら、その「黒い画素」にラベルを振る。

2行目も
二○○○○○○○●○○●○○○○○○○○○○○○○○○○
行○●○○●○○○○○○○○●○○●○○○○○●○○●○
目○○○○○○○○○○○○○○○○●○○●○○○○○○○
の3ラインを左から順に同時に調べ「画素3個ペア」で見ていくしかないだろう。

「元の映像」で「ラインとラインの間に黒い点」があれば「1行目の4番」のように「縦に、2つの黒い画素が並ぶ可能性がある」ので「同じラベルが複数の画素に付く可能性」も考慮すること。

なお
  ○○○○○○○○○○○○○○○○○○○○○○○○○●○
一○○○○○○○○○○○○○○○○○○○●○○●○○○○
行○○○○○○○●○○●○○●○○●○○○○○○○○○○
目○●○○●○○○○○○○○○○○○○○○○○○○○○○
  ○○○○○○○○○○○○○○○○○○○○○○○○○○○
  ○○○○○○○○○○○○○○○○○○○○○○○○○●○
二○○○○○○○○○○○○○○○○○○○●○○●○○●○
行○○○○○○○○○○●○○●○○●○○○○○○○○○○
目○●○○●○○●○○○○○●○○○○○○○○○○○○○
  ○○○○○○○○○○○○○○○○○○○○○○○○○○○
  ○○○○○○○○○○○○○○○○○○○○○○○○○●○
のように、ラインが斜めにひん曲がった状態で画像を取り込んでしまった場合は、単純な方法ではラベリングできない。

「予想されるライン」を斜めのベクトルを持つ「線分」として求め、その「線分」に添って「銭分上の画素を、上下の画素とともに3画素ペアでスキャン」していく事になる。
    • good
    • 0
この回答へのお礼

chie65535さん、ありがとうございます!
元の画像の状態として、3ラインで走査していけばできそうですが、弱冠曲がっているので、もしかしたらchie65535さんが言ってくれた通り、線分を求めてその線分上を走査する必要がでてくるかもしれません。
まず「3ラインでラベリング」を試してみたいと思います。
自分無知で申し訳ないのですが、もしよろしければ、3ラインでラベリングのプログラムや参考サイトなどがございましたら教えていただけると助かります(><)よろしくお願いします。。

お礼日時:2009/01/27 18:40

>自分無知で申し訳ないのですが、もしよろしければ、3ラインでラベリングのプログラムや参考サイトなどがございましたら教えていただけると助かります(><)よろしくお願いします。


単にdata[X軸][ライン]だとしたら、
line = 0;
while( line < ラインの終わり ) {
 for( int x=0 ; x<X軸の最大値 ; x++ ) {
  if( data[x][line+0]==0 || data[x][line+1]==0 ||data[x][line+2]==0 ) {
   //ラベリングする
  }
 }
 line += 3;//?3つ進ませるのが良いかは取り込み方が一定化できる場合だけ。機械誤差を含むなら工夫が必要。
}
って事では?
ただ、常に3ラインなのかも機械誤差が含まれるなら問題になる気がする。

この回答への補足

機械誤差とは
取り込む際の誤差で画像が歪む?という事でよろしいでしょうか?
プログラム貼り付けありがとうございます!
参考にさせてもらいます!

補足日時:2009/01/28 14:24
    • good
    • 0

歪んだ画像も処理できる、ラベリングの方法。



01○○○○○○○○○○○○○○○○○○○○○○○○○○
02○○○○○○○○○○○○○○○○○○○○○○○●○○
03○○○○○○○○○○○○○○○○○●○○●○○○○○
04○○○○○●○○●○○●○○●○○○○○○○○○○○
05○○●○○●○○○○○○○○○○○○○○○○○○○○
06○○○○○○○○○○○○○○○○○○○○○○○○●○
07○○○○○○○○○○○○○○○●○○●○○●○○○○
08○○○○○○●○○●○○●○○●○○○○○○○○○○
09●○○●○○○○○○○○○○○○○○○○○○○○○○
10○○○○○○○○○○○○○○○○○○○○○○○○○○
11○○○○○○○○○○○○○○○○○○○○○○○○○●
12○○○○○○○○○○○○○○○○○○○●○○●○○●
13○○○○○○○○○○●○○●○○●○○○○○○○○○
14○●○○●○○●○○○○○●○○○○○○○○○○○○
15○○○○○○○○○○○○○○○○○○○○○○○○○○
16○○○○○○○○○○○○○○○○○○○○○○○○○●

上記のような画像があったとする。

まず、1行目の先頭「A」を見付けなければならない。

01○○○○○○○○○○○○○○○○○○○○○○○○○○
02○○○○○○○○○○○○○○○○○○○○○○○●○○
03○○○○○○○○○○○○○○○○○●○○●○○○○○
04○○○○○●○○●○○●○○●○○○○○○○○○○○
05○○ A○○●○○○○○○○○○○○○○○○○○○○○
06○○○○○○○○○○○○○○○○○○○○○○○○●○
07○○○○○○○○○○○○○○○●○○●○○●○○○○
08○○○○○○●○○●○○●○○●○○○○○○○○○○
09●○○●○○○○○○○○○○○○○○○○○○○○○○
10○○○○○○○○○○○○○○○○○○○○○○○○○○
11○○○○○○○○○○○○○○○○○○○○○○○○○●
12○○○○○○○○○○○○○○○○○○○●○○●○○●
13○○○○○○○○○○●○○●○○●○○○○○○○○○
14○●○○●○○●○○○○○●○○○○○○○○○○○○
15○○○○○○○○○○○○○○○○○○○○○○○○○○
16○○○○○○○○○○○○○○○○○○○○○○○○○●

まず、上から1ラインづつスキャンしていき、Bを見付ける。

01○○○○○○○○○○○○○○○○○○○○○○○○○○
02○○○○○○○○○○○○○○○○○○○○○○○ B○○
03○○○○○○○○○○○○○○○○○●○○●○○○○○

01→○○○○○○○○○○○○○○○○○○○○○○○○○
02○○○○○○○○○○○○○○○○○○○○○○○ B○○
03○○○○○○○○○○○○○○○○○●○○●○○○○○

01→→○○○○○○○○○○○○○○○○○○○○○○○○
02○○○○○○○○○○○○○○○○○○○○○○○ B○○
03○○○○○○○○○○○○○○○○○●○○●○○○○○
(略)
01→→→→→→→→→→→→→→→→→→→→→→→→→→
02→→→→→→→→→→→→→→→→→→→→→→→ B○○
03○○○○○○○○○○○○○○○○○●○○●○○○○○

この時点ではラベリングはしない。なぜなら、現在行っている処理は「Aを発見するため」である。

但し、Bの位置を「最も最近に見付けた画素」として位置を記憶しておくこと。

01○○○○○○○○○○○○○○○○○○○○○○○○○○
02○○○○○○○○○○○○○○○○○○○○○○○ B○○
03○○○○○○○○○○○○○○○○○●○○●○○○○○
04○○○○○●○○●○○●○○●○○○○○○○○○○○
05○○ A○○●○○○○○○○○○○○○○○○○○○○○
06○○○○○○○○○○○○○○○○○○○○○○○○●○
07○○○○○○○○○○○○○○○●○○●○○●○○○○
08○○○○○○●○○●○○●○○●○○○○○○○○○○
09●○○●○○○○○○○○○○○○○○○○○○○○○○
10○○○○○○○○○○○○○○○○○○○○○○○○○○
11○○○○○○○○○○○○○○○○○○○○○○○○○●
12○○○○○○○○○○○○○○○○○○○●○○●○○●
13○○○○○○○○○○●○○●○○●○○○○○○○○○
14○●○○●○○●○○○○○●○○○○○○○○○○○○
15○○○○○○○○○○○○○○○○○○○○○○○○○○
16○○○○○○○○○○○○○○○○○○○○○○○○○●

Bから、左方向に進みながら、Bがあるラインの上下3画素をスキャンしていく。「◎」が調べる画素である。

01○○○○○○○○○○○○○○○○○○○○○○◎○○○
02○○○○○○○○○○○○○○○○○○○○○○◎●○○
03○○○○○○○○○○○○○○○○○●○○●○◎○○○
04○○○○○●○○●○○●○○●○○○○○○○○○○○
05○○ A○○●○○○○○○○○○○○○○○○○○○○○

01○○○○○○○○○○○○○○○○○○○○○◎○○○○
02○○○○○○○○○○○○○○○○○○○○○◎○●○○
03○○○○○○○○○○○○○○○○○●○○●◎○○○○
04○○○○○●○○●○○●○○●○○○○○○○○○○○
05○○ A○○●○○○○○○○○○○○○○○○○○○○○

01○○○○○○○○○○○○○○○○○○○○◎○○○○○
02○○○○○○○○○○○○○○○○○○○○◎○○ B○○
03○○○○○○○○○○○○○○○○○●○○ C○○○○○
04○○○○○●○○●○○●○○●○○○○○○○○○○○
05○○ A○○●○○○○○○○○○○○○○○○○○○○○

Cを発見した所で「最も最近に見付けた画素」をCに更新する。

そして、Cがあるラインの上下3画素をスキャンしていく。

01○○○○○○○○○○○○○○○○○○○○○○○○○○
02○○○○○○○○○○○○○○○○○○○◎○○○ B○○
03○○○○○○○○○○○○○○○○○●○◎ C○○○○○
04○○○○○●○○●○○●○○●○○○○◎○○○○○○
05○○ A○○●○○○○○○○○○○○○○○○○○○○○

01○○○○○○○○○○○○○○○○○○○○○○○○○○
02○○○○○○○○○○○○○○○○○○◎○○○○ B○○
03○○○○○○○○○○○○○○○○○●◎○ C○○○○○
04○○○○○●○○●○○●○○●○○○◎○○○○○○○
05○○ A○○●○○○○○○○○○○○○○○○○○○○○

このように、黒い画素を見付けるたびに「最も最近に見付けた画素」を更新しながら、スキャンするラインを調整しつつ、左へ進んで行く。

01○○○○○○○○○○○○○○○○○○○○○○○○○○
02○○○○○○○○○○○○○○○○○○○○○○○ B○○
03○○○○○○◎○○○○○○○○○○●○○●○○○○○
04○○○○○●◎○●○○●○○●○○○○○○○○○○○
05○○ A○○●◎○○○○○○○○○○○○○○○○○○○
06○○○○○○○○○○○○○○○○○○○○○○○○●○

まず最初の問題は、上記の「次」である。見付かる画素は以下のようにD、Eの2つある。

01○○○○○○○○○○○○○○○○○○○○○○○○○○
02○○○○○○○○○○○○○○○○○○○○○○○ B○○
03○○○○○◎○○○○○○○○○○○●○○●○○○○○
04○○○○○ D○○●○○●○○●○○○○○○○○○○○
05○○ A○○ E○○○○○○○○○○○○○○○○○○○○
06○○○○○○○○○○○○○○○○○○○○○○○○●○

この場合は「Dの1ライン上から、Eの1ライン下までの4ライン」が「探すライン」となる。

01○○○○○○○○○○○○○○○○○○○○○○○○○○
02○○○○○○○○○○○○○○○○○○○○○○○ B○○
03○○○○◎○○○○○○○○○○○○●○○●○○○○○
04○○○○◎●○○●○○●○○●○○○○○○○○○○○
05○○ A○◎●○○○○○○○○○○○○○○○○○○○○
06○○○○◎○○○○○○○○○○○○○○○○○○○●○

つまりは「見付かった画素のうち、一番上にある画素の1ライン上から始めて、一番下にある画素の1ライン下まで」と言う事になる。

前述の「Bがあるラインの上下3画素をスキャンしていく」も「Bが一番上にある画素であり、かつ、一番下にある画素」であるので、結局は「同じ事」である。

03○○○◎○○○○○○○○○○○○○●○○●○○○○○
04○○○◎○●○○●○○●○○●○○○○○○○○○○○
05○○ A◎○●○○○○○○○○○○○○○○○○○○○○
06○○○◎○○○○○○○○○○○○○○○○○○○○●○

03○○○○○○○○○○○○○○○○○●○○●○○○○○
04○○◎○○●○○●○○●○○●○○○○○○○○○○○
05○○ A○○●○○○○○○○○○○○○○○○○○○○○
06○○◎○○○○○○○○○○○○○○○○○○○○○●○

この時点でAを発見する。「最も最近に見付けた画素」をAに更新していく。

そして、更に左に進む。

03○○○○○○○○○○○○○○○○○●○○●○○○○○
04○◎○○○●○○●○○●○○●○○○○○○○○○○○
05○◎ A○○●○○○○○○○○○○○○○○○○○○○○
06○◎○○○○○○○○○○○○○○○○○○○○○○●○

03○○○○○○○○○○○○○○○○○●○○●○○○○○
04◎○○○○●○○●○○●○○●○○○○○○○○○○○
05◎○ A○○●○○○○○○○○○○○○○○○○○○○○
06◎○○○○○○○○○○○○○○○○○○○○○○○●○

画像の一番左に達した所で、一旦、終了する。

ここで「最も最近に見付けた画素」が「A」になっている。

つまり、この時点での「最も最近に見付けた画素」が「1行目の開始点」であり、探すべき「A」である。

さて、無事にAが見付かったので、ここから「ラベリング」を行う。

まず「1行目の1つ目」として「A」にラベルを付ける。

次に行うのは「今やった事を、逆方向、つまり、右方向に行うだけ」である。図の「H」は「ヒットした画素」で「H」を順にラベリングすれば良い。

03○○○○○○○○○○○○○○○○○●○○●○○○○○
04○○○◎○●○○●○○●○○●○○○○○○○○○○○
05○○ A◎○●○○○○○○○○○○○○○○○○○○○○
06○○○◎○○○○○○○○○○○○○○○○○○○○●○

03○○○○○○○○○○○○○○○○○●○○●○○○○○
04○○○○◎●○○●○○●○○●○○○○○○○○○○○
05○○ A○◎●○○○○○○○○○○○○○○○○○○○○
06○○○○◎○○○○○○○○○○○○○○○○○○○●○

03○○○○○○○○○○○○○○○○○●○○●○○○○○
04○○○○○ H○○●○○●○○●○○○○○○○○○○○
05○○ A○○ H○○○○○○○○○○○○○○○○○○○○
06○○○○○◎○○○○○○○○○○○○○○○○○○●○

03○○○○○○◎○○○○○○○○○○●○○●○○○○○
04○○○○○ H◎○●○○●○○●○○○○○○○○○○○
05○○ A○○ H◎○○○○○○○○○○○○○○○○○○○
06○○○○○○◎○○○○○○○○○○○○○○○○○●○

03○○○○○○○◎○○○○○○○○○●○○●○○○○○
04○○○○○ H○◎●○○●○○●○○○○○○○○○○○
05○○ A○○ H○◎○○○○○○○○○○○○○○○○○○
06○○○○○○○◎○○○○○○○○○○○○○○○○●○

03○○○○○○○○◎○○○○○○○○●○○●○○○○○
04○○○○○ H○○ H○○●○○●○○○○○○○○○○○
05○○ A○○ H○○◎○○○○○○○○○○○○○○○○○
06○○○○○○○○◎○○○○○○○○○○○○○○○●○

03○○○○○○○○○◎○○○○○○○●○○●○○○○○
04○○○○○ H○○ H◎○●○○●○○○○○○○○○○○
05○○ A○○ H○○○◎○○○○○○○○○○○○○○○○
06○○○○○○○○○○○○○○○○○○○○○○○○●○

中略。

01○○○○○○○○○○○○○○○○○○○○○○◎○○○
02○○○○○○○○○○○○○○○○○○○○○○◎●○○
03○○○○○○○○○○○○○○○○○ H○○ H○◎○○○
04○○○○○ H○○ H○○ H○○ H○○○○○○○○○○○
05○○ A○○ H○○○○○○○○○○○○○○○○○○○○
06○○○○○○○○○○○○○○○○○○○○○○○○●○

01○○○○○○○○○○○○○○○○○○○○○○○◎○○
02○○○○○○○○○○○○○○○○○○○○○○○ H○○
03○○○○○○○○○○○○○○○○○ H○○ H○○◎○○
04○○○○○ H○○ H○○ H○○ H○○○○○○○○○○○
05○○ A○○ H○○○○○○○○○○○○○○○○○○○○
06○○○○○○○○○○○○○○○○○○○○○○○○●○

01○○○○○○○○○○○○○○○○○○○○○○○○◎○
02○○○○○○○○○○○○○○○○○○○○○○○ H◎○
03○○○○○○○○○○○○○○○○○ H○○ H○○○◎○
04○○○○○ H○○ H○○ H○○ H○○○○○○○○○○○
05○○ A○○ H○○○○○○○○○○○○○○○○○○○○
06○○○○○○○○○○○○○○○○○○○○○○○○●○

01○○○○○○○○○○○○○○○○○○○○○○○○○◎
02○○○○○○○○○○○○○○○○○○○○○○○ H○◎
03○○○○○○○○○○○○○○○○○ H○○ H○○○○◎
04○○○○○ H○○ H○○ H○○ H○○○○○○○○○○○
05○○ A○○ H○○○○○○○○○○○○○○○○○○○○
06○○○○○○○○○○○○○○○○○○○○○○○○●○

右端まで行けば、1行目のラベリングが終了する。

左方向、右方向のどちらの方向にスキャンする時も、注意しなければならないのは下図のような「スキャンしているラインからはみ出した、縦に並んだ黒い画素」である。

スキャン方向→
○○○○○○○○○○
○○○○○○○●○○
○○○○●○○○○○
○○◎○●○○○○○
○ H◎○○○○○○○
○○◎○○○○○○○

○○○○○○○○○○
○○○○○○○●○○
○○○○●○○○○○
○○○◎●○○○○○
○ H○◎○○○○○○
○○○◎○○○○○○

○○○○○○○○○○
○○○○○○○●○○
○○○○●○○○○○
○○○○ H○○○○○
○ H○○◎○○○○○
○○○○◎○○○○○

この時点で、縦に並んだ2つのうち「下の1つだけ」しかヒットしない。

なので「ヒットした画素があったら、スキャンしてないラインであっても、上下の1画素も確認する必要」がある。

上下も確認すると、2つ縦に並んだ両方がヒットする。

○○○○○○○○○○
○○○○○○○●○○
○○○○ H○○○○○
○○○○ H○○○○○
○ H○○◎○○○○○
○○○○◎○○○○○

そして、次にスキャンするのは「見付かった画素のうち、一番上にある画素の1ライン上から、一番下にある画素の1ライン下まで」と言う事になる。

○○○○○○○○○○
○○○○○○○●○○
○○○○ H○○○○○
○○○○ H○○○○○
○ H○○◎○○○○○
○○○○◎○○○○○

○○○○○○○○○○
○○○○○◎○●○○
○○○○ H◎○○○○
○○○○ H◎○○○○
○ H○○○◎○○○○
○○○○○○○○○○

○○○○○○○○○○
○○○○○○◎●○○
○○○○ H○◎○○○
○○○○ H○◎○○○
○ H○○○○◎○○○
○○○○○○○○○○

○○○○○○○○○○
○○○○○○○ H○○
○○○○ H○○◎○○
○○○○ H○○◎○○
○ H○○○○○◎○○
○○○○○○○○○○

○○○○○○○○◎○
○○○○○○○ H◎○
○○○○ H○○○◎○
○○○○ H○○○○○
○ H○○○○○○○○
○○○○○○○○○○

さて、次は「2行目の処理」である。

まず、ライン09の左端、2行目の先頭「E」を見付けなければならない。

01○○○○○○○○○○○○○○○○○○○○○○○○○○
02○○○○○○○○○○○○○○○○○○○○○○○●○○
03○○○○○○○○○○○○○○○○○●○○●○○○○○
04○○○○○●○○●○○●○○●○○○○○○○○○○○
05○○●○○●○○○○○○○○○○○○○○○○○○○○
06○○○○○○○○○○○○○○○○○○○○○○○○●○
07○○○○○○○○○○○○○○○●○○●○○●○○○○
08○○○○○○●○○●○○●○○●○○○○○○○○○○
09 E○○●○○○○○○○○○○○○○○○○○○○○○○
10○○○○○○○○○○○○○○○○○○○○○○○○○○
11○○○○○○○○○○○○○○○○○○○○○○○○○●
12○○○○○○○○○○○○○○○○○○○●○○●○○●
13○○○○○○○○○○●○○●○○●○○○○○○○○○
14○●○○●○○●○○○○○●○○○○○○○○○○○○
15○○○○○○○○○○○○○○○○○○○○○○○○○○
16○○○○○○○○○○○○○○○○○○○○○○○○○●

これも、一行目と同じく、上から1ラインづつスキャンしていく事になる。

但し「ラベリング済みの画素は無視」する。

「ラベリング済みの画素は無視」で探すと、「F」が見付かる。

01○○○○○○○○○○○○○○○○○○○○○○○○○○
02○○○○○○○○○○○○○○○○○○○○○○○●○○
03○○○○○○○○○○○○○○○○○●○○●○○○○○
04○○○○○●○○●○○●○○●○○○○○○○○○○○
05○○●○○●○○○○○○○○○○○○○○○○○○○○
06○○○○○○○○○○○○○○○○○○○○○○○○ F○
07○○○○○○○○○○○○○○○●○○●○○●○○○○
08○○○○○○●○○●○○●○○●○○○○○○○○○○
09 E○○●○○○○○○○○○○○○○○○○○○○○○○
10○○○○○○○○○○○○○○○○○○○○○○○○○○
11○○○○○○○○○○○○○○○○○○○○○○○○○●
12○○○○○○○○○○○○○○○○○○○●○○●○○●
13○○○○○○○○○○●○○●○○●○○○○○○○○○
14○●○○●○○●○○○○○●○○○○○○○○○○○○
15○○○○○○○○○○○○○○○○○○○○○○○○○○
16○○○○○○○○○○○○○○○○○○○○○○○○○●

あとは「1行目の処理と同じ」である。

実は「1行目の最初のスキャンの時も、ラベリング済みの画素は無視」で良い。そうする事で「1行目も2行目も同じ処理」となる。

なお「歪んだ画像」を走査している場合「ラベリング済みの画素が、再度、ヒットしてしまう」と言う事が起きる。

なので「ラベリング済みの画素は、画像データを○に書き替えるなど、2度とヒットしない」ようにすると良い。

その場合、当然「元画像が残ってないと困る」ので、ラベリングは「画素を自由に書き替えて良い、作業用画像」で行う事となる。

あとは、上記の通りにプログラミングするだけ。
    • good
    • 0
この回答へのお礼

とても丁寧にありがとうございます!まだ画像処理、c言語自体もほとんどわからない身ですが、理解する事ができました。
どうにかプログラミングを組んでみたいと思います!
8近傍のラベリングとはまったく違ったものですね;
厳しそうですが、今から頑張りたいと思います。
解決口を教えて頂いて大変助かりました。
本当にありがとうございました!

お礼日時:2009/01/28 14:35

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!