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

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

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

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

Python 3.x

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

Python

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

Q&A

2回答

6327閲覧

pythonでのopencvで複雑な条件のマスクを生成したい。

kaitokimura

総合スコア59

OpenCV

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

Python 3.x

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

Python

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

0グッド

0クリップ

投稿2017/10/11 05:44

編集2022/01/12 10:55

一部抜粋

python

1mask = np.zeros(h.shape, dtype=np.uint8) 2mask[条件式] = 255 3img = cv.bitwise_and(image, image, mask=mask)

opencvを用いて一定の色を抽出したいです。
配列を見ると条件が単純ではなくhsvの値を用いてマスクを生成したいのですが
例えば
hの値が30〜50でsが40から60vが70から80のとき、
hの値が60〜70でsが40から60vが30から60のときに
マスクを生成したいのですが良い方法が思いつきません。どのように複雑な条件のマスクを生成できますでしょうか?

(((30 <= h and h <= 50) and (40 <= s and s <= 60) and (70 <= v and v <= 80) and (60 <= h and h <= 70) and (40 <= s and s <= 60) and (30 <= v and v <= 60)))の場合
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()というエラーがでました。

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

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

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

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

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

karamarimo

2017/10/11 09:52

(30 <= h and h <= 50) and ... and (60 <= h and h <= 70) だと必ずFalseになってしまうのでは。
umyu

2017/10/11 13:21

cv.inRangeは既に確認済みでしょうかー?
guest

回答2

0

NumPy では、mask(bool型の配列) の演算は、andorなどのブール演算子ではなく、&|などのビット演算子を使用します。

Python

1h = numpy.arange(0, 10) 2h # -> array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) 3 4mask = (h > 3) & (h < 9) 5mask # -> array([False, False, False, False, True, True, True, True, True, False], dtype=bool) 6 7h[mask] # -> array([4, 5, 6, 7, 8]) 8 9h[mask] = 255 10h # -> array([ 0, 1, 2, 3, 255, 255, 255, 255, 255, 9])

なお、ブール演算子(andorなど)とは異なり、ビット演算子(&|など)は、比較演算子(><など)より優先度が高いため、()を使用して優先順位を指定する必要があります。

投稿2017/10/11 10:16

編集2017/10/11 10:43
copepoda

総合スコア324

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

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

0

ちょっとやってみたというレベルなので正しいか(あるいはベストか)は自信がないですが、ヒントになるかも知れないと思い、コメントしています。

python

1import numpy as np 2 3h = np.zeros([2, 2], dtype=np.uint8) 430 <= h and h <= 50 5==> 6ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

同じshapeの行列同士をandで結合すれば要素ごとにandが計算され、その結果が元と同じshapeの行列になる・・・と、自分は思ったのですがどうもそうではないようです。

numpy.logical_and

をみるとこの関数でできるようでした。

np.logical_and(30 <= h, h <= 50)
とすると期待通りの演算が行われているように見えました。


追記:numpy.arrayとnumpy.matrixで演算子の意味が違うという記事を見ました。上記はnumpy.arrayでやってみたものですが、numpy.mat('1 2; 3 4')などとして作成した行列でやってみても結果は同様(andは同様のエラー、numpy.logical_andだと同じ結果)になるように見えました。

それとバージョン書き忘れました。
Python 3.6.0(Windows 10)
numpy 1.12.1+mkl

投稿2017/10/11 09:29

編集2017/10/11 09:41
KSwordOfHaste

総合スコア18392

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

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

KSwordOfHaste

2017/10/11 10:52

恐れていた通り拙すぎる回答でした・・・スミマセン!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問