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

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

新規登録して質問してみよう
ただいま回答率
85.35%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

OpenCV

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

Q&A

解決済

1回答

2454閲覧

検出したblob内の色判定

nakanori773

総合スコア4

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

OpenCV

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

1グッド

0クリップ

投稿2020/10/10 02:02

編集2020/10/10 02:05

前提・実現したいこと

背景が白~灰色の紙に記載した赤色の検出をしています。
現在は色検出した矩形画像を、ヒストグラム化して判断していますが、十分な結果が得られていません。

1.色検出した矩形画像内の抽出範囲の中身の色判定をしたいです。
2.色判定で各部分のHSV各値を取得するにはどうすればよいでしょうか?

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

HSVフィルタでは白線より上の範囲(色相は赤の範囲)設定してます。

イメージ説明

用紙に記載するものが、赤鉛筆、ボールペン、サインペンなどが考えられ、
あまり「赤!」というイメージのところでの検出が出来ません。
検出結果に色の判定を行い、
両端の黄色の円の部分(黒味、白味が強いところ)が抽出された場合、
除外しようと思いまず。

イメージ説明
イメージ説明
図のような抽出画像をそのままヒストグラム化して、
先頭と最後の部分を除いた範囲で、各色の最大値(Y座標)と位置(X座標)から、赤色を判断しています。※他の色よりX座標が後ろで発生など。

イメージ説明
イメージ説明
しかし検出したい中には、上の様なヒストグラムをもつ画像も検出されることがあり、先述の方法では判断できず困っています。

そこで検出した画像(矩形)をそのままではなく、実際の輪郭の中身に関して
処理をしたく思いますが、輪郭までは取得できたものの、その後はどうしたらいいかわかりません。

該当するメソッドや方法等、ご教授いただけたらと思います。

該当のソースコード

C#

1//HSV設定 2//20, 255, 220 3//200, 64, 30 4 5//ヒストグラム計算 6Mat b_hist = new Mat(); 7Mat g_hist = new Mat(); 8Mat r_hist = new Mat(); 9Cv2.CalcHist(new Mat[] { img }, new int[] { 0 }, null, b_hist, 1, new int[] { 256 }, new Rangef[] { new Rangef(0, 256) }); 10Cv2.CalcHist(new Mat[] { img }, new int[] { 1 }, null, g_hist, 1, new int[] { 256 }, new Rangef[] { new Rangef(0, 256) }); 11Cv2.CalcHist(new Mat[] { img }, new int[] { 2 }, null, r_hist, 1, new int[] { 256 }, new Rangef[] { new Rangef(0, 256) }); 12 13//ヒストグラム抽出 14//正規化 15Cv2.Normalize(b_hist, b_hist, 0, histImage.Height, NormTypes.MinMax); 16Cv2.Normalize(g_hist, g_hist, 0, histImage.Height, NormTypes.MinMax); 17Cv2.Normalize(r_hist, r_hist, 0, histImage.Height, NormTypes.MinMax); 18

開発環境

C#(visualstudio2015)、OpenCV(OpenCVSharp3 v4.0.0.20181129)

graduationtips👍を押しています

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

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

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

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

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

fana

2020/10/12 09:13

> 両端の黄色の円の部分(黒味、白味が強いところ)が抽出された場合、除外しよう やりたいことはコレなのだと思いますが,以降のヒストグラムを用いた処理との関連性がわかりません. 素人目には,単純にSやVの値で判断すれば良さそうに思えるのですが,それではダメなのでしょうか?
nakanori773

2020/10/13 05:10

いつもお世話になります。 やりたいことはご推察の通りです。 ヒストグラム以降のところは、色の解析でWEB検索したときに、RGBの値をヒストグラムとして表示するロジックを発見したので取り入れました。 ご指摘の通り、SVの値で判断すればよいのですが、値をとる方法がわかりません。
fana

2020/10/13 08:41

質問に記載されている "HSVフィルタ" なる処理において {H,S,V}の値を画素毎に算出しているものと想像するのですが…違うのでしょうか?
nakanori773

2020/10/13 09:20

HSVフィルタという表現がまずかったかもしれません。 まず、質問のヒストグラムの上の赤いシミみたいな画像を得るために、 OpenCvSharp.Cv2.LUTの処理に用いる、第2引数のlutを設定するためのHSV値の下限、上限は設定してます。 その後、FilterByAreaでblobを取得してからは、 何も画像に関しては加工せずに、赤いシミみたいな画像のまま、質問のソースのCv2.CalcHistを通しています。 特に画素毎に値を確認するなどは出来ていません。
guest

回答1

0

ベストアンサー

両端の黄色の円の部分(黒味、白味が強いところ)

というのは,HSV色空間で言えば「S,Vが小さいところ」という話になるかと思いますので,
(R,G,Bのヒストグラムを見る処理よりも先に)まずは直接的にSやVに閾値をかけてみるのがよいのではないでしょうか.


…という話に関して,

HSVフィルタ

というのがまさにそういった処理を指す言葉かと読んだのですが,違うのでしょうか……?
まぁ,その「HSVフィルタ」でSやVに対する処理をやれないのだとしても,
OpenCVのcvtColor関数あたりで各画素のHSV値を算出し,実データにおいてSやVの値がどうなっているのかを見てみるとよいのではないかと思います.
すなわち,

  • H が「赤」の範囲内であって
  • S がある閾値以上であって
  • V もまた別の閾値以上である

という画素を抽出する,という方法で残したい画素だけを残すことができないのか,というのを.

投稿2020/10/13 08:56

fana

総合スコア11996

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

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

nakanori773

2020/10/27 09:51

ご教授いただいた通り、 取得した矩形画像に関して画素毎にHSV値を確認して、閾値を設けて対処いたしました。 ご返事が遅くなりまして申し訳ございません。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問