• 締切済み

教えてください!C言語で画像の直線検出

お世話になります。 C言語で画像処理を勉強してます。今直線検出がたいへんです。 例の画像があります(ここはjpgですけど、実際使っているのはppmです):http://www.xiaochuncnjp.com/bbs/attachments/month_0711/20071112_ea2afaf31222783dfbc9datB3cLMcy7H.jpg ご覧の通り傾きの違う3種類の直線があります。それぞれの傾きを検出し、後面の垂直に近い直線は前面の水平に近い直線に遮られる時、後面の直線の画素値を使って、前面の直線の画素を埋めたいです。どうすればいいでしょうか?今全然わかりません。 そのアルゴリズム、教えていただければ幸いです。

みんなの回答

  • noocyte
  • ベストアンサー率58% (171/291)
回答No.2

パターン認識は机上だけでいくら考えてもダメで, 実際に動かしてみながら試行錯誤しないとなかなかうまくいきません. (1)~(5) のプログラムを全部書いてから動かすのではなく, (1),(2),…,(5) を順番に作っては動かしてみて, うまくいけば次に進むようにした方がいいでしょう. たぶん (2) がなかなかうまくいかず,色々試行錯誤することになると思います. ノイズにより本来のエッジにヒゲが生えたり,途切れたりして追跡中に迷う可能性があります. (4) のピーク検出にも少し工夫が必要かも.

remember11
質問者

お礼

noocyteさん、いつもご解答いただきどうもありがとうございます。返事遅れまして申し訳ございません。noocyteさんのおかげさまで、大体目標達成しました。 傾きを調べた後、私はその傾きにあるすべての画素の分散値を計算し、閾値判定の方法(もし一本の直線だったら、分散値は小さいわけ)で、直線を検出し、その後ろの画素値で一番前の直線埋めました。 6日間がんばって、このような結果を得ました。ご覧ください。 もとの画像: http://www.xiaochuncnjp.com/bbs/attachments/month_0711/20071128_ee90d0311393057524d7gQlddHvLwucT.jpg 前の直線を検出した画像: http://www.xiaochuncnjp.com/bbs/attachments/month_0711/20071128_7b95db96813d76499c48xrPHAX4PGhDO.jpg 最後の結果、処理した画像: http://www.xiaochuncnjp.com/bbs/attachments/month_0711/20071128_416abe213e8e01032448l0zO40HnVtvk.jpg 大体できましたけど、処理した画像にはまだ違和感が有ります。綺麗じゃない部分はまだ残ってます。直線判定と画素を埋める手法のアルゴリズムの問題なんですか?まだ考えてます。

  • noocyte
  • ベストアンサー率58% (171/291)
回答No.1

とりあえず画像の描き変えはおいといて,線分検出と傾き判定の方法について. (1) エッジ検出フィルタでエッジを検出する. (2) エッジを追跡して線分を検出し,両端点の座標を記憶する. (3) 検出した各線分の傾きを求め,ヒストグラムを作成する. (4) 画像の直線の傾きは2つだけなので,   ヒストグラムに2つの大きなピークが出るはず.   ⇒ それらのピークの位置から2つの傾きの値を求める. (5) (3) で検出した各線分について,どちらの傾きに近いかを判定する. ディジタル信号処理講座 (エッジ検出) http://www.f-kmr.com/dsp_edge.htm 1次微分(差分)によるエッジ検出 http://www.mis.med.akita-u.ac.jp/~kata/image/sobelprew.html Visual C++ 2005 Express Edition を用いた易しい画像処理(13) ――――エッジ検出と画像ファイルの読み書き ―――― http://homepage3.nifty.com/ishidate/vcpp05_g13/vcpp05_g13.htm

remember11
質問者

お礼

noocyteさん、親切なご解答どうもありがとうございます。とりあえず私はnoocyteさんの言ったことに従ってやってみます。そして結果をここで報告します。そのときもよろしくお願いいたします。