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

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

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

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

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Python

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

Q&A

解決済

2回答

657閲覧

写真の特徴をもとに検出したポイントの色濃度を求めたい

tochibow

総合スコア7

OpenCV

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

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Python

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

0グッド

0クリップ

投稿2022/01/04 14:21

編集2022/01/04 14:29

前提・実現したいこと

Swift・Python・OpenCV初心者です。
iPhoneで撮影したイメージ内の下記特徴を検出して各ポイントの色濃度を算出したいと考えています。

  • イメージの特徴

 ・長径(横):短径(縦)=20:15程度の緑色の楕円がある
・上記楕円の内側に横並びに並んだ3箇所のポイントA、R、Bがある
・上記楕円の上部に横並びにA、R、Bという緑色の文字が記載されている
・ポイントA、R、Bは上記A、R、Bという各文字の下方にそれぞれ位置する
・ポイントA、R、Bはそれぞれ直径2程度(上記楕円とのサイズ比)の円である
・ポイントAは淡いピンク色であるが白色の場合もある
・ポイントRは白色である
・ポイントBは赤色であるが白色の場合もある
・背景は白色である

イメージ説明

上記特徴を元に①〜④を実現したいです。
①ポイントA、R、Bの有無を検出する
②検出されたポイントAとRの色濃度比を算出する
③検出されたポイントBの色濃度を算出する
④上記①で検出無しの場合エラーを表示し、有りの場合②の濃度比を表示する

実現案としてまずはPython・OpenCV等を使用して下記を検討中です。
・楕円を検出する
・A、R、B文字を検出する
・楕円の内側 & 文字Aの垂線上の円をポイントAとする
・楕円の内側 & 文字Rの垂線上の円をポイントRとする
・楕円の内側 & 文字Bの垂線上の円をポイントBとする

使用に適した関数などありましたらなんでも構いませんのでアドバイスいただけると幸いです。
よろしくお願いします。

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

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

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

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

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

fana

2022/01/05 01:22 編集

> iPhoneで撮影した 撮影具合によって考慮すべき事柄が変わるように思えます. もっともわかりやすい話としては, 「真正面から回転が無い状態で撮影(撮影結果画像内での図形は提示されている画像のような理想的な状態に極めて近い像となる)」という前提条件があるのか否かによって全然変わりますよね. 他にも 画像の鮮明さとか,サポートすべき図形像のサイズ範囲だとか… 「背景が白」とは言っても,画像上での色は一様ではない可能性もあるでしょうし(陰影とか). 誤検出しそうな何かが写り込むことがあり得るのか否か次第でパターンの検出処理は大きく変わるでしょうし(あり得ないなら,てきとーな処理で十分だろうし) 提示されたような人工画像を相手にするのと実撮影画像を相手にするのとでは変わってくるところもあるでしょうから,実際の撮影画像の例を数点示すと良いのではないでしょうか.
fana

2022/01/05 01:42 編集

像のサイズ にも関連しますが, 楕円パターンが安定して得られるような話か否か(楕円の線が途切れてしまう,あるいは上にある文字とくっついてしまう,etc)等によって,処理の取っ掛かりが変わるのではないかと思います. 他にも,特徴パターンが複数存在する場合に互いに近すぎてくっついてしまうとか,いろいろと.
tochibow

2022/01/05 03:36

多々アドバイス頂き感謝致します。ご指摘の点仰る通りと思います。 iPhoneでの撮影を想定しているため、陰影や濃度の誤差は折り込みたいと考えています。まずはフィジビリティ検討の為の要素確認をPythonか Swiftでやりたいと考えています。 楕円のパターンや文字間隔のバラツキは無いものと考えております。あった場合はエラーとする考えです。
guest

回答2

0

ベストアンサー

[質問への追記・修正、ベストアンサー選択の依頼] の欄に色々と書きましたが,
どの程度 簡単な/面倒な 話なのかによって全然違ってくると思います.

話が簡単な側に関して言うならば,

  1. 緑 or Not で2値化

(とりあえずこの処理で楕円の線が途切れないことが大前提.近隣の文字と楕円がくっつくのはOK)
2. 背景を floodFill あたりで「緑」な側の色で塗りつぶす.
結果,「Not」側の領域として残っているのは「楕円の内側」と「文字の内側の小領域」くらいになる.
後者を適当な手段で捨てる.
ここはモルフォロジで潰してしまうのでも良いかもしれないし,「単に面積が小さすぎる」だとか「近隣に自身のN倍以上のでかい面積のやつが存在する」だとかいう条件で捨てるだとか.(小さなその他のノイズもこの処理でまとめて除去されると良い)
3. 残っている「楕円の内側」らしき領域の外周に楕円当てはめを行い,当てはまり具合や径の比率あたりのチェックが通ったものをパターン検出結果候補とする.
4. 3.の結果(楕円サイズや向き)から,「{A,R,B} があるハズの位置」が推定できる(回転を考慮するなら2箇所の候補になるが)から,1.の結果画像上でそこらへんに相応な緑の塊が存在するかどうかをチェックする.
存在していればパターン検出結果とする

くらいでパターン部を見つけられるのではなかろうか.

あとは,元画像上で「3箇所のポイント」の色を調べれば良い.

投稿2022/01/05 02:02

編集2022/01/05 02:17
fana

総合スコア11708

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

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

fana

2022/01/05 02:08 編集

パターンを「真正面」から撮影する(像が歪まないこと)想定の話だが,像のロール回転に関してはあってもOKな話として書いた. ・ステップ2.の floodFill は話のイメージが掴みやすいように入れてみたが,実際的には後段処理で背景領域を棄却できるだろうから無くてもよい. ・文字の形状(例えば「文字の内側の小領域」とか)を調査対象に使うような話も考えられるが,撮影画像次第ではロバスト性に欠けると思う.
fana

2022/01/05 02:37 編集

CVの関数に関しては, ・「2値化」は threshold や adaptiveThreshold, または色の範囲で inRange を使うとか ・「モルフォロジ」は erode, dilate, morphologyEx など ・「楕円当てはめ」は fitEllipse あたり ・領域の検出は findContours とか connectedComponents系 あたりが使えるかな
fana

2022/01/05 02:40 編集

> 像のロール回転 すら無いという想定なら,元画像を横方向に潰して「円」を検出することから始める手もあるかもね. (OpenCVでは円の検出に HoughCircles なんてのがある)
tochibow

2022/01/05 03:40

大変参考になる回答ありがとうございます。 頂いた情報をもとにOpenCVで実験してみたいと思います。
guest

0

Pythonでやるなら以下のようになります。

python

1import numpy as np 2import cv2 3img = cv2.imread('ARB.png') 4img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 5#cv2.imwrite('ARBgray.png', img_gray) 6_, bw = cv2.threshold(img_gray, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU) 7bw = cv2.bitwise_not(bw) 8#cv2.imwrite('ARBbw.png', bw) 9contours, hierarchy = cv2.findContours(bw, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE) 10result = cv2.drawContours(img.copy(), contours, -1, color=(255, 0, 0), thickness=2) 11cv2.imwrite('ARBc.png', result)

出力
輪郭

青が輪郭(contours)です。

以下で、個々の輪郭の座標がわかります。

python

1>>> for c in contours: 2... print(cv2.boundingRect(c)) 3... 4(110, 105, 16, 18) 5(55, 105, 15, 17) 6(21, 50, 138, 101) 7(14, 43, 152, 115) 8(117, 32, 7, 6) 9(62, 29, 5, 6) 10(117, 27, 6, 5) 11(88, 27, 7, 6) 12(114, 25, 12, 14) 13(86, 25, 13, 14) 14(57, 25, 14, 14)

あとはご自身でやってみてください。

投稿2022/01/04 16:44

編集2022/01/04 22:56
ppaul

総合スコア24666

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

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

fana

2022/01/05 02:31

> あとはご自身でやってみてください とのことですが,「ここからどういう方向で進めるような話が考えられるのか?」という例みたいな話が無いと,この問題に対してアドバイスとなる要素が何なのかがわからないように思えます. 「グレースケールで2値化 → findContours」というだけの話では,回答内容の意図を掴みかねるというか… (例えば,パターンの色が明記されている話に対して何故グレースケール処理でいくのか? 等)
tochibow

2022/01/05 03:44

迅速な回答でデモ実装して頂き大変感謝しております。参考にさせていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問