質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Q&A

2回答

1050閲覧

ハフ変換で本をセグメントしたいです

退会済みユーザー

退会済みユーザー

総合スコア0

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

0グッド

1クリップ

投稿2019/05/14 04:41

編集2019/05/14 23:10

前提・実現したいこと

本棚の画像を読み込ませて、画像の中に何の本があるかを推定するものを作りたいです。

そのための手順として

  1. 本棚の画像から本ごとにハフ変換でエッジ検出してセグメントする
  2. 本の文字を読み込む

というものなのですが、ハフ変換のところでつまづいています。

発生している問題・エラーメッセージ

上の画像を読み込ませると、検出される直線の数がとても少ないです。

(元画像)
イメージ説明
(Canny変換をした画像)
イメージ説明
(ハフ変換をした画像)
イメージ説明

該当のソースコード

python

1import cv2 2import numpy as np 3 4img = cv2.imread('input.jpg') 5gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) 6edges = cv2.Canny(gray,50,150,apertureSize = 3) 7 8lines = cv2.HoughLines(edges,1,np.pi/180,200) 9print(len(lines)) 10for line in lines: 11 for rho,theta in line: 12 a = np.cos(theta) 13 b = np.sin(theta) 14 x0 = a*rho 15 y0 = b*rho 16 x1 = int(x0 + 1000*(-b)) 17 y1 = int(y0 + 1000*(a)) 18 x2 = int(x0 - 1000*(-b)) 19 y2 = int(y0 - 1000*(a)) 20 21 cv2.line(img,(x1,y1),(x2,y2),(0,0,255),2) 22 23cv2.imwrite('output.jpg',img) 24 25

試したこと

cvs.cannyや'cv2.HoughLines'のパラメーターを色々変えてみましたがうまくいきません。本の検出の精度を上げるためにはどのような工夫をすればいいか教えてください。

補足情報(FW/ツールのバージョンなど)

論文はこちらのサイトを読みました。ハフ変換で処理していたのでハフ変換でうまく機能すると思います。
https://faculty.ist.psu.edu/zzhou/paper/JCDL17-SmartLibrary.pdf

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ikadzuchi

2019/05/14 16:06

「edges」の状態の画像が欲しいです。
退会済みユーザー

退会済みユーザー

2019/05/14 23:10

状態画像を追加しました。よろしくお願いします
guest

回答2

0

python

1lines = cv2.HoughLines(edges,1,np.pi/180,150)

150のところが、変更した閾値ですが、これが投票数の閾値で、小さくするとたくさん本数が示されます。ご質問の時から時間が経ってますが、見栄えがよくなったので、一応報告します。
イメージ説明

投稿2021/01/11 13:57

Kenta_py

総合スコア132

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

リンク先で一瞬だけ単語"Hough"を検索してみた程度ですが,
その論文ではHough変換は "dominant direction" (多分,本の方向≒画像の回転具合というか)を得ることに用いているだけであるように見えます.
同様のことをするなら,今の結果でも十分ではないでしょうか?


とりあえず提示されたcannyの結果からハフ変換一発で所望の線群(本と本の境界)だけを取り出そうというのは難しいと思います.
余計な(文字等の)エッジ点由来の投票量の方が圧倒的に強くなりそうです.

まずは,エッジ点を絞り込むことを考えた方が良いように思います.

  • 上記のdominant directionの方向から外れているやつは捨てる
  • 周辺の勾配方向の分布がばらばらなやつは捨てる

とか.

(エッジがまっすぐでなく曲がっている場所があるのも,ハフ変換でやるには面倒かな?というのもありますが)


微妙に似たような?話

投稿2019/05/15 01:43

編集2019/05/15 01:51
fana

総合スコア11654

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/05/15 02:32

おお、ありがとうございます! hough変換は回転軸を見つけるために使われてるだけで、背表紙の抽出には全然使われていませんでした。そう言われて読み返してみると論文を完全に誤読していることがわかりました。 どうやら四角形の抽出には テキスト部分とそうでない部分を抽出するCNNのアルゴリズムの作成が必要だとわかりました! 本の境界線部分の抽出は別のCNNのアルゴリズムを用いて抽出できるようで、正直よくわかっていません... ですがこれで詰まっていた部分が進みそうなのでありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問