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

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

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

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

2823閲覧

Hough変換によって検出した円内部の色による条件分岐

lebdom_11

総合スコア6

OpenCV

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/10/22 03:53

前提・実現したいこと

Python、OpenCVを用いて丸い野菜の結球部の円検出をHough変換によって行いました。
まず現画像に対して先にCanny処理によってエッジ検出をしました。この際に、閾値などもいろいろ試しております。
その後、そのエッジ検出した画像に対し、Hough変換を行いました。
その際、背景などに土、影などのノイズが多いため、誤検出が多くなってしました。

そこで、実現したいことなのですが、この誤検出を色情報によってなくしたいです。
検出した円の内部の色の違いによって、描画する円の色を変える。もしくは、描画自体をしないという風にしたいです。
誤検出した部分は現画像と重ねて確認すると、検出したい野菜の結球部とは明らかに違う色なので。

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

わからないこととしましては、円内部の色をどのように調べるのかいうのと、条件分岐をどこで行うのかということです。 そのプログラム自体がまったくわからないという状況です。

該当のソースコード

Python

1 2import cv2 3 4img = cv2.imread("c:/temp/ABC.jpg") 5 6# グレースケールに変換する。 7grey = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 8 9 10# ハフ変換で円検出する。 11circles = cv2.HoughCircles( 12 grey, cv2.HOUGH_GRADIENT, dp=1.0, minDist=20, param1=80, param2=28, minRadius=1,maxRadius=25 13) 14 15# 色情報を加える 16hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) 17 18 19# 検出結果を描画する 20if circles is not None: 21 circles = circles.squeeze(axis=0) # (1, NumCircles, 3) -> (NumCircles, 3) 22 for cx, cy, r in circles: 23# ここのあたりで色による条件をいれる? 24 25 # 円の円周を描画する。 26 cv2.circle(img, (cx, cy), int(r), (0, 0, 255), 2) 27 # 円の中心を描画する。 28 cv2.circle(img, (cx, cy), 2, (0, 0, 255), 2) 29 30 31# 結果を保存する。 32cv2.imwrite("c:/temp/hough.jpg", img)

試したこと

円内部ではなく、画像全体に対して緑の部分(検出したいものの色)だけが残るようなことは試してみました。

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

OpenCV 4.2.0
Python 3.7

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

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

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

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

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

fana

2020/10/22 04:24

何を問題点としているのか がわかりません. > 円内部の色をどのように調べるのか 円の内側にある画素群の値を単に調べてやれば良いのではないでしょうか. (面積を有するエリアである円の「内部の色」というのが 平均値なのか中央値なのか最頻値なのかその他の何かなのかはわかりませんが,とにかく想定されている「色」という量を画素群の値から求めてやれば良いのではないかと思うのですが.) 一体何が問題点なのですか? > 条件分岐をどこで行うのか こちらも何を問題点としているのかがわかりません. 色で判断するのであれば,色を把握した以降の必要な時点において行うだけでは…?
fana

2020/10/22 04:27

(プログラムコードとして実装することに関しては一旦忘れて) まずは処理のフローを日本語で考えて確定させることを行うべき状況にあるようにも見受けます.
lebdom_11

2020/10/22 05:09

大変申し訳ございません。 プログラミング初心者なため、質問が非常にわかりにくくなっていたかもしれないです。 > 円の内側にある画素群の値を単に調べてやれば良いのではないでしょうか. 単に調べるということを、どういうコードでやるのかということ自体がわからないです…。 無知で大変申し訳ございません。 アドバイスありがとうございます。
fana

2020/10/22 07:06

「円の内部の色を調べる」という話を細分すれば (A) 画像の各画素値へのアクセスすること (B) 画像を構成する画素群のうち,円の範囲内の画素群とはどれか? という話 (C) (B)の範囲内の画素群に関して(A)の手段で画素値をチェックしていく処理の実装方法 (D) 「円の内部の色」っていうのは具体的には何? …と,色々と要素があると思うのですが,実際にどこが問題点となっているのか? という感じです.
guest

回答1

0

ベストアンサー

とりあえず,
まずはこのくらいの話から始めてみたら良いのではないか? という簡単な処理フロー
を示します.


必要な準備

  • 画像の特定の座標(x,y)の画素値(B,G,R)を取得する方法を把握してください.
  • ハフ変換の結果の意味を把握する:得られた結果から各円の中心座標や半径の値が取得できること.

簡単なフロー

  1. ハフ変換で円を検出(既存処理).→複数の円検出結果が得られる.
  2. 検出された全ての円について,以下の処理で要不要を判定する.

●円の判定処理

  1. 元画像を適当に Gaussian Blur か何かでぼかす.
  2. このぼかした絵の,円の中心座標位置の画素値を取得する
  3. 取得した画素値が「検出したい野菜の結球部とは明らかに違う色」か否かを判定する.

(簡便には,あらかじめ定めておいた「野菜の結球部」の代表的な色との差を見て,その差が閾値以上なら「違う色」と判定するとか)
→判定結果次第でこの円を採用or棄却

※上記1.のぼかす量を円の半径に比例する形で決める等しても良いかもしれない.

[念のため説明]
ぼかしてから円の中心位置の色を見る理由:
最も単純な処理を考えるならば(ぼかさずに)元画像から単純に「円の中心位置」の1点だけを見ることになるだろうけど,それだといかにもしょぼい:
たまたまその場所が反射光で光っていたりとか,ノイズの影響が大きい画素だったりしたらうまくいかないだろう.
→そこで,「円の中心の1点だけじゃなくて,その付近のある範囲の画素群の色を見てやる」ことを考える.
少数の画素の画素値がたまたま変質していてもその他大勢の色の力で頑張れるように.
→しかしある範囲内の画素を全て見てやる処理をちまちま書くのはだるい.
だからぼかす.
ぼかした画像におけるある位置の画素値というのは,元画像においてその位置の周辺の画素値を用いた(加重)平均なのであるから,
ぼかした画像の上で1個の画素の色を見るということは,元画像において着目画素の周辺の画素群の画素値も考慮した色を見ているということ.
ぼかしの強さ(≒ガウシアンカーネルのサイズ)は,見てやる範囲の広さに相当.

投稿2020/10/22 10:42

編集2020/10/22 10:59
fana

総合スコア11708

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

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

lebdom_11

2020/10/23 01:18

ご丁寧にありがとうございます! 教えていただいた通り、自分で勉強しながら進めていきます。 ありがとうございました。
fana

2020/10/23 02:03 編集

いきなり完成品ができることはないでしょうから, 【 (1)方法論を考えて → (2)それを実装して試してみる → (3)結果を踏まえてまた考える → … 】 を試行錯誤することが必要です. 現状,最初の(1)が少しぼんやりとしているように見受けましたので,とっかかり用の(1)の案を回答として例示しました. --- ここでは「とりあえずハフ変換 → 結果から要らないのを捨てる」という路線の話をしていますが, 「ハフ変換が要らないものを大量に出さないようにするための何らかの工夫 → ハフ変換 → …」みたいに,前段に何か処理を入れるような話も考えられるかもしれませんね. 色々と考えてみてください.
lebdom_11

2020/10/23 04:11

本当にありがとうございます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問