• ベストアンサー

エッジの2値画像から閉じている四角形を探す

エッジの情報の2値画像があります。閉じている四角形を探して、さらに各頂点の座標を調べる方法を考えています。 いったんラベリングしてから同じラベルの画素の隣接を追跡して最初の地点に戻ってきたら閉じているみたいな方法でやろうかなと考えています。 もっとよい方法をご存知でしたら参考図書やURL、論文なんかを教えてもらえるとうれしいです。 頂点を探す方法は見当もつかないので、ヒントとなることを何でも教えていただけないでしょうか? よろしくお願いします。

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

  • ベストアンサー
  • tatsumi01
  • ベストアンサー率30% (976/3185)
回答No.1

エッジ画像と輪郭を区別して下さい。 輪郭とは、周囲の白領域とエッジの黒部分との境界で、時計回り(または反時計回り)に一周することができます。エッジ画像は境界付近に複数の黒画素があって、どこが真の境界か判然としません。言ってみれば、輪郭は1次元の画素系列で、エッジ画像は単なる2次元画像です。 エッジ画像(でなくても元の2値画像)があれば、その輪郭を追跡するアルゴリズムはあります。恐らく詳細を書いた公開文献はなく、メーカーなどのノーハウでしょう。 輪郭画素を時計回り(反時計回り)に追跡して輪郭点系列ができれば、輪郭を一周し、各点Xについて前方向に3戻った点Aと後方向に3行った点B(3でなくて5だって構いません)をもとめ、AXを結ぶ線分、XBを結ぶ線分を作り、二つの線分のなす角度が90°に近ければ頂点となります(実際には、さらに修正が必要です)。

その他の回答 (2)

  • tatsumi01
  • ベストアンサー率30% (976/3185)
回答No.3

No. 1 ですが、前のコメントが言葉足らずでした。 エッジ画像は2次元画像です。輪郭と見たところは同じですが、画素相互の関係がないところが違います。エッジ画像そのままではその上を一周することができません。 輪郭は座標系列のリストで、いわば1次元情報です。輪郭の上の画素には順番がついているので一周することができます。 エッジ画像の上を一周するように工夫することはできますが、結局それは輪郭抽出していることになります。

  • tatsumi01
  • ベストアンサー率30% (976/3185)
回答No.2

No. 1 ですが、輪郭を求めるアルゴリズムを簡単に書いておきます。 (0)対象画像を左上から右に向かって走査し、最初にぶつかる黒画素をスタート画素Sとします(ある走査線が全部白画素だったら次の走査線に移る)。Sの座標を記録します。 (1)Sの回りには8画素ありますが、左の画素(白の筈)から始めて時計回りに一周し、黒画素を探します。見つからなければ孤立点です。 (2)見つかった黒画素の座標を記録します (3)その画素をSとして(1)と同じことをします。ただし、周辺8画素の中の開始点は左ではなく、前の一周での最後の白画素からです。 (4)最初のSと同じ座標に戻れば終わり。 このアルゴリズムにはいろいろな変種が考えられます。 なお、このアルゴリズムで求められる輪郭は1個です。2個以上の輪郭を探したいならいろいろな工夫が必要です。 輪郭追跡のプログラムはバグが出やすいので頑張って下さい。 輪郭が求まったあと、頂点を探す方法はいろいろ考えられますが、とりあえず No. 1 で書いた方法が良いでしょう。

matico
質問者

お礼

回答ありがとうございます。 質問でエッジと書いていたのは、輝度をあらかじめ2値化したもののエッジなのでtatsumi01さんのおっしゃられる輪郭というものに当てはまりますね。 輪郭というキーワードは、調べていなかったのであたらしいヒントになりました。ありがとうございます

関連するQ&A

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

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

  • 緯度・経度からの距離計算

    ある地点の緯度・経度ともう一方のある地点の緯度・経度が わかっているとして、その各緯度・経度より2地点間の距離を 計算できないのでしょうか? 計算方法を知りたいのです。 なんか公式みたいなものはないのでしょうか? なんかヒントになるサイトのURLでもかまいません。 お願いします。教えて下さい。

  • ひもが切れる長さと引っ張る力の関係

    「ひもグミを両側から引っ張って千切ったとき、より引っ張る力を弱くした側の長さのほうが、より引っ張る力を強くした側の長さよりも長くなる」という現象をどこかで見た記憶があるのですが(もしかすると「引っ張る力を強くした側のほうが長さが長くなる」というものだったかも知れません・・・。)これは物理的に説明付けることのできる現象なのでしょうか。 ネットや図書館などで文献を調べてみようと思うのですが、物理は余り詳しく学んでおらず(千切れる→ひずみ?→応力??という言葉が薄っすら頭に浮かぶ程度です)、何を手がかりとすればよいのか見当がつきません。キーワードや参考となるサイトのURLなど、何かヒントとなりそうなものをお教え願えないでしょうか。よろしくお願いします。

  • Delphi6で、指定した座標のRGB値を取得する

    保存された画像(bmpまたはjpg形式)の指定した座標 (仮に画面中央とします。また、マウスで指定した場所など、座標を設定した後に座標を設定しなおすことはありません。また指定した座標というのは一箇所で良いです。複数あれば、なおよいですが。) のRGB値を返すにはどうしたらよいでしょうか? テキストボックスなり、ラベルなりにR、B、G、それぞれの値を出力するのが目標です。 また、Delphiに対して理解が不足しているので、ソースプログラムや参考URLをそのまま載せていただけると嬉しいです。 方法をご存知の方いましたら、是非よろしくお願いします!m(_ _)m

  • 貼った画像の細いエッジについて

    PaintShopPro9で作った画像をブログに貼りました。 そして、そのブログをInternetExplorerで閲覧したところ、何等問題はありませんでした。 ところが、MozillaFirefoxで閲覧すると、前記の画像の外周に、 外に向かって影のある細いエッジが見られるのです。 MozillaFirefoxにおいても、このエッジが現れないようにする方法をご教示ください。

  • エッジで画像は見れるの?

    PHS エッジ”キョーセラのPS-C2を使っているのですが 1:この機種で携帯から送ってもらった画像を   見ることはできるのでしょうか? 2:また、ほかの機種で画像を見れる機種があるのでしょうか? 3:エッジでカメラ付きってありますか? 以上よろしくお願いいたします。

  • 画像のエッジ抽出について

    画像のエッジ抽出について 画像処理を学び始めたばかりのものです。 細菌や細胞などのエッジを、 C言語を使って抽出しようと思っているのですが ・Sobelフィルタ ・FFTによる低周波カット ・ラプラシアンフィルタなど の代表的なフィルターを組み合わせて使っても、綺麗にエッジが出ません。 二値化してエッジになるのには遠い状態です。 自分の撮った画像が悪かったのか・・と思いましたが、 フリーソフトのimageJで、エッジ抽出という処理をすると 綺麗に最近の形状が出ます。 これはどのようなアルゴリズムを使っているのでしょうか・・・ 教科書やネットを調べていても、上の3つ以外にフィルタがなさそうなので 途方に暮れています。。 お恥ずかしいですが、よろしくお願いいたします。。

  • エッヂの待ち受け画像

    携帯では、いろんな待ち受け画像を無料でダウンロード出来るサイトって、たくさんありますよね?それのPHS、H”バージョンってあるのでしょうか??そういうサイト、もしくは実際やってる方は、いろいろ教えてください!

  • 隣接行列プログラム

    隣接行列を使ったグラフ探索のプログラムを作りたいのですが。。 手も足もでません。どなたか助けていただけないでしょうか?? まずstate.txt 1 2 3 0 といったフォーマットに従った状態空間が記述された テキストファイルを読み込んで、隣接行列を動的に作成し、 さらにその状態空間をfwrite()を用いてバイナリ形式のファイルにする。 実行時のコマンドラインは次の書式に従う。 > ./MakeGraph テキストファイル(読み込み元) 状態空間(書き込み元) 状態数 [Enter] もうひとつは、上で作成した状態空間ファイル(バイナリ形式)をmalloc(),fread()を用いて メモリ上に復元し、経路探索を行う。 ただし、オプション指定で縦型探索と横型探索を切り替えられるようにすること。 実行時のコマンドラインは次の書式に従う。 > ./Search [-bd] 状態空間ファイル  状態数  開始状態  終了状態 [Enter] ちなみに、 使用例 > ./MakeGraph state.txt state.bin 4 [Enter] > ./Search -d state.bin 4 1 0 [Enter] > ./Search -b state.bin 4 3 3 [Enter] > ./Search -bd state.bin 4 2 0 [Enter] 結果例 1-0 : d : 0 <- 3 <- 1 3-3 : b : 3 <- 1 <- 0 <- 3 2-0 : b : Not Found... 2-0 : d : Not Found... これらを作るうえでのヒントのようなものもあるのですが、さっぱりで。。 状態空間をファイルから取り込むため、隣接行列で表現した状態空間のサイズは可変、 (たとえば、状態数5ならば、25個)である。したがって、メモリは動的に確保する必要がある。 また探索時に容易に扱えるようにするため、隣接行列は2次元配列であることが望ましい。 しかし、2次元の動的確保は難易度が高いので、1次元配列の動的確保を応用することで考える。 1次元配列を状態数2個確保し、2点の座標を指定することで、要求する要素へ アクセスできるマクロCoordinates(x, y, size)を用意する。 このマクロを利用すれば、1次元配列で確保したデータを2次元として扱うことができる。 ****************************************** MakeGraph.cとSearch.cは次にあります。 ここにはのせきれなかったので。。 お手数おかけします。 http://mugen.cc.osaka-kyoiku.ac.jp/pg/ あとstate.txt のフォーマットは次のようになっています。 これはデータ構造などででてくる有向グラフを隣接行列で示した場合、 スタート地点の状態0から状態1に(0→1) 状態1から状態2と、ゴールの状態3に(1→2、1→3) ゴールの状態3からスタート地点の状態0に(3→0) となっていた場合に、状態0~3までのリンク先をあらわしたものです。 単に、机上において、隣接行列で表現すると   0 1 2 3 0 0 1 0 0 1 0 0 1 1 2 0 0 0 0 3 1 0 0 0 となります。(線がはいっていないのでややこしいかもしれませんが。。) これと同じ意味で、 1 (状態0のリンク先で、1の直後に¥n) 2 3 (状態1のリンク先で、2と3の間に空白、さらに3の後ろに¥n)   (状態2のリンク先はなにもないので、まっしろ) 0 (状態3のリンク先) となっています。こういう説明で伝わっているかわかりませんが、 よろしくおねがいします!!

  • 画像処理 エッジ検出について

    エッジ検出の手法にエッジ・モデルを用いるものがあるのですが,3次の多項式で近似するものとはどのようなものか教えてください.また,プログラムではどのように書けばよいのでしょうか