• ベストアンサー

ラベリング方法の工夫をしたいのですが・・・

はじめまして!大学で画像処理について学び始めたものですが、 ラベリング処理でわからないことがあり、質問させていただきました! 二値化はなんとかできたのですが・・・ 下記のようにラベルをつけるにはどうしたらよろしいでしょうか?? 画素数 ○⇒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近傍ラベリングは通常のラベリングと同じような結果になってしまいました。 もしどなたか、このようなラベリング方法を知っている方など いましたらご教授お願いします!! 説明不足、意味がよくわからないところなどありましたらご指摘お願いします よろしくお願いします(><)

質問者が選んだベストアンサー

  • ベストアンサー
  • chie65535
  • ベストアンサー率43% (8539/19415)
回答No.5

歪んだ画像も処理できる、ラベリングの方法。 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度とヒットしない」ようにすると良い。 その場合、当然「元画像が残ってないと困る」ので、ラベリングは「画素を自由に書き替えて良い、作業用画像」で行う事となる。 あとは、上記の通りにプログラミングするだけ。

shooooow
質問者

お礼

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

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (4)

  • zwi
  • ベストアンサー率56% (730/1282)
回答No.4

>自分無知で申し訳ないのですが、もしよろしければ、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ラインなのかも機械誤差が含まれるなら問題になる気がする。

shooooow
質問者

補足

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

全文を見る
すると、全ての回答が全文表示されます。
  • chie65535
  • ベストアンサー率43% (8539/19415)
回答No.3

と言う事は、以下のようになっている事がある訳だな?   ○○○○○○○○○○○○○○○○○○○○○○○○○○○ 一○○○○●○○○○○○○○○○○●○○●○○○○○○○ 行○●○○○○○●○○●○○●○○○○○●○○●○○●○ 目○○○○○○○○○○●○○○○○○○○○○○○○○○○   ○○○○○○○○○○○○○○○○○○○○○○○○○○○   ○○○○○○○○○○○○○○○○○○○○○○○○○○○ 二○○○○○○○●○○●○○○○○○○○○○○○○○○○ 行○●○○●○○○○○○○○●○○●○○○○○●○○●○ 目○○○○○○○○○○○○○○○○●○○●○○○○○○○   ○○○○○○○○○○○○○○○○○○○○○○○○○○○   ○○○○○○○○○○○○○○○○○○○○○○○○○○○ で   ○○○○○○○○○○○○○○○○○○○○○○○○○○○ 一○○○○ 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画素ペアでスキャン」していく事になる。

shooooow
質問者

お礼

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

全文を見る
すると、全ての回答が全文表示されます。
  • arain
  • ベストアンサー率27% (292/1049)
回答No.2

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

shooooow
質問者

補足

不勉強ですいません! まず、二次元配列です。x、y軸にして座標をテキスト出力する予定です。 ●⇒0 ○⇒255 の数字は輝度値です。なのでただの画素の集合と思っていただいて大丈夫だと思います。 行の意味は 質問で記述したのをアップすると ○○○○○○○○○○○○○ ○●○●○●○●○●○●○ ○○○○○○○○○○○○○ ○●○●○●○●○●○●○ ○○○○○○○○○○○○○ このように画素が横に並んだように見えるので (実際には上下左右に若干乱れています。) 一行目と 二行目に分けさせていただきました;自分視点で書いてしまいすいません・・ その不ぞろいに並んでいる左から右に画素を1,2,3・・・と 順番をラベリングしたいと思っているんですが・・・ ソースなのですが今ソースが手元にありませんので明日にはUPさせてもらいます・・・

全文を見る
すると、全ての回答が全文表示されます。
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

「一行目」とか「二行目」の意味が分からん. どこが一行目でどこが二行目なのか. でもって, 単純に「左から右にスキャンする」だけじゃダメなの?

shooooow
質問者

補足

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

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • ラベリング処理

    はじめまして。最近、画像処理を勉強し始めたものです。 ラベリング処理で質問したいことがあり、書き込みさせていただきました。 2値化処理した画像を作成したとします。 例えば以下のような0(黒)と255(白)の画像です。 ここで、連結し合う255の画素を同じ番号でラベル付けして、異なるラベル番号の255の島(塊)の数を数えたいと思ってます。 以下の例では、連結し合う同一ラベルの255の島の数は「3つ」となります。 さらに最下2行のように、画素数が3つというような小さな島は除去するという条件もつけられたらなと思ってます。 自分ではなかなかうまくいかず・・・ 是非、どういうプログラムを組んでいけば良いか、ご指導をいただけないでしょうか。 何卒よろしくお願いいたします。 0 0 255 255 0 0 0 0 255 255 255 255 0 0 0 0 255 255 255 255 0 0 0 0 255 255 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 0 0 0 0 255 255 255 255 0 0 0 0 255 255 255 255 0 0 0 255 255 255 0 0 0 0 255 255 255 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 255 255 0 0 0

  • 画像のラベリング

    画像処理について勉強しています。 画像のラベリングを行うプログラムを書いていたのですが、意図した結果になりません。 以下の関数で実現しようとしましたが、上手くいきませんでした。何か、決定的に間違っている点などがありましたら、教えてください。 また、参考になるWebページなどがありましたら、教えていただけると幸いです。 image2[][]には、レナ画像の512x512を判別分析法を使用して2値化した画像データが格納されています。 また、label[]は全て-1で初期化しました。(initialize()) void labeling(){ int x,y; int up_label,left_label; int label_num=1; //初期ラベル int label_add=1; //ラベルの増分 int max; int i; initialize(); for(y=0; y<y_size1; y++){ for(x=0; x<x_size1; x++){ if(image2[y][x]==0 && label[y][x]==-1){ up_label=left_label=500; if(y-1>=0) up_label=label[y-1][x]; if(x-1>=0) left_label=label[y][x-1]; if(up_label==500 && left_label==500){//(0,0)の地点の処理 label[y][x]=label_num; }else if(up_label==left_label){//上と左が等しい場合の処理 //上と左のラベルが無い場合はラベルを作る if(up_label < 0) label_num += label_add; //ラベルを付与 label[y][x]=label_num; }else{//それ以外の処理 //上と左で小さいほうのラベルを付与する if(up_label<0) label[y][x]=left_label; else if(left_label<0) label[y][x]=up_label; else label[y][x]= (up_label < left_label)? up_label:left_label; } } } } }

  • 差し込み印刷について

    エクセルのデータをワードで差し込み印刷しようとしています。 印刷するラベルは 縦21列 横4行  このラベルに差し込み印刷をしようとすると、通常は左から右へ、上から下への順で データ差し込まれるのですが、これを上から下へ、左から右への順に印刷したいのですが、 可能ですか?

  • CSSのテーブルの縦100%について

    CSSの縦100%指定について伺います。 現在、三行二列のテーブルを、縦100%のレイアウトにしようとしております。 上段一行は一列に統合して、ヘッダーを入れます。 下段一行は一列に統合して、フッターを入れます。 一行目と三行目の縦幅をピクセルで指定して、 二段目の高さをautoに指定し、 テーブル全体の縦の高さを100%にして、 ウィンドウサイズが変わったときに二段目のみが伸縮するように 出来るものでしょうか。 お分かりの方、どうぞご助言をお願いいたします。

  • エクセルの使い方

    Windowsでエクセル2002を使っています。 行や列を一つ飛ばしで(一行ごと、一列ごとに)色を着けていきたいのですが、やり方が分かりません。 行の一番左の数字の所を選択して色を変えれば一行全体が変わるのですが、 一行飛ばしで選択してまとめて色を変えようと思いシフトを押しながら選択したのですが、色が変わって欲しくない中間までが選択されてしまいます。 一行(一列)飛ばしてや、離れたところの任意の行(列)を選択する方法があれば教えて下さい。 よろしくお願いします。

  • Securityって毎回ダウンロードするんでしょうか?

    初歩的な質問かもしれません。でも心配で… 度々NortonInternetSecurityのタイトルでダウンロードのようなものが始まるのです。画面中央に縦4センチ横11センチほどの枠が表れ、上記のタイトルの下にいろんな記号が横一列に並んでいます。(例えば一番多いのが極太の縦線でバーコードに似ていますが、そのほかアルファベットや数字なども見られます。)3行目には9センチほどの帯があって、左から順に青色で埋められていくのです。インストールの感じに近いかもしれません。 先月2004をインストールしました。 WinMEです。 情けない話ですが、これが何を意味するのかわからなくて教えていただきたいと思います。よろしくお願いいたします。

  • Excel2007で、行の自動色分けについての質問です。

    Excel2007で、行の自動色分けについての質問です。 B1とB2をセルの結合で一行にします。その左A1、A2はそのままにしておきます。これをワンセットとして考えます。つまり一列目は二行、2列目は1行になっているものを一単位として考えるという意味合い。 MOD関数で一行単位で色分けできますが、この一単位を一行と考えて、色分けしようとしても1列目の余りが違うので、一列目は色つきのセル(行)とそうでないセル(行)に別れてしまいますし・・・ なにかいい方法があればお願いします。

  • エクセルで管理表を作りたい

    20枚程になる機械の一覧表を作成したのですが、各ページの表の一行目に機械名や日付などの項目のタイトルを入れて、一列目には機械の横に1から20まで番号を付けます。追加や削除があったときに簡単に一行削除や行追加ですむように各ページの一行目、一列目に常に同じ内容を印刷するにはどうすればいいんでしょうか? 一行目はページ設定の中の印刷タイトルを使ったんですが、列の方がよくわかりません。いい方法があれば教えてくださいよろしくお願いします。

  • WORD2002で、縦26字×横20行に設定する方法を教えて下さい!

    WORD2002で、縦26字×横20行に設定する方法を教えて下さい! ヘルプを見ても、ハッキリ対応したような箇所が見当たりません。 「文字の均等割り付け」だと、全選択でも、一行だけしか対応しません。 教えて下さい!

  • ウインドウー画面がおかしくなった

    vistaです。、覚えが無いのですがパソコンを立ち上げたらウインドウ画面が可笑しくなってしまいました。画面下部にあるべきスタートボタン、クイック起動ボタン、等の一行が画面の右端縦一列に表示するようになりました。システムの修復をこころみたのですが、復元の起点が当日のみになっていて、復元してみたのですが同じでした。右縦に並んだ下部にあるべきスタートボタンを元の横一列に戻すにはどうすればいいのでしょうか、大変困っています。