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

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

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

JupyterLabは、Jupyter notebookの後継の対話型開発環境(IDE)です。データの可視化がインタラクティブで、プラグイン作成により新しいコンポーネントの追加および既存のコンポーネントも統合可能。サーバに閉じているため、データ分析に向いています。

OpenCV

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

Python

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

Q&A

1回答

2145閲覧

[Python]OpenCVで色の割合を求める。

退会済みユーザー

退会済みユーザー

総合スコア0

JupyterLab

JupyterLabは、Jupyter notebookの後継の対話型開発環境(IDE)です。データの可視化がインタラクティブで、プラグイン作成により新しいコンポーネントの追加および既存のコンポーネントも統合可能。サーバに閉じているため、データ分析に向いています。

OpenCV

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

Python

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

0グッド

0クリップ

投稿2022/11/30 03:28

編集2022/11/30 09:03

イメージ説明イメージ説明

前提

素人なのでご教授いただければ幸いです。
Open-CVで色の割合を求めるシステムをつくっている。

実現したいこと

紅葉を定点観測して得た画像を分析して紅葉日と落葉日を判断させたい。その中で今回、撮影した画像のなかの色の割合を出したいと考えています。

発生している問題

紅葉と判定している部分が明らかに35%を超えているように感じているが35%と出ており、おかしい気がする。

該当のソースコード

import numpy as np import cv2 import collections import pandas as pd from matplotlib import pyplot as plt img_bgr = cv2.imread('IMG_7170.jpg', 6) for i in range(int(hit/2)):img_bgr[i] = img_bgr[i] / 2 img_hsv = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2HSV) hsv_min = np.array([ 20, 64, 0]) hsv_max = np.array([ 90, 255, 255]) mask = cv2.inRange(img_hsv, hsv_min, hsv_max) plt.imshow(mask) print("Rust ratio is :", sum(mask) / 255 / hit / wid * 100, '%')

試したこと

他の画像でやってみたが他の画像だとそれ相応の値が出ていると感じている。

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

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

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

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

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

jbpb0

2022/11/30 06:32

> hsv_min = np.array([ 47, 255, 173]) hsv_max = np.array([0, 255, 255]) だと、 H:47以上、0以下 S:255だけ V:173以上、255以下 に合致したものだけになります まずHがありえない条件(min>max)なので、検出数が0になります 画像の検出したい「黄色」の部分のHSV変換後のHの値を確認して、それが範囲に入るように(かつ、min<maxになるように)設定してみてください また、Sが255だけって彩度maxのみなので、画像から検出したい「黄色」の部分のSが本当に255なのか、確認した方がいいですよ もちろんVの確認も要ります 画像の検出したい「黄色」の部分のHSV変換後のH, S, Vの値を確認して、それらが全て範囲に入るように、「hsv_min」と「hsv_max」を設定してみてください 画像の左端の「黄色」と、真ん中やや右の「黄色」は、また違うでしょうし
退会済みユーザー

退会済みユーザー

2022/11/30 09:05

jbpb0さんありがとうございます! 試行錯誤して行っております非常に感謝してます。ありがとうございます。
jbpb0

2022/11/30 10:54

maskは2次元なので、「sum(mask)」は一つの値ではなく、画像の横方向の画素数と同じ要素数の配列になるはずです 「sum(mask)」じゃなくて「np.sum(mask)」でしょうか? 質問の現在の画像をダウンロードして、質問のコードを「np.sum(mask)」に変えて、「hit」と「wid」に画像の縦・横方向の画素数をそれぞれ入れて、他はそのままで実行したら、 Rust ratio is : 78.22978741277834 % となり、 > 35%と出ており とはなりませんでした 画像かコードか、どちらか(あるいは両方)が質問者さんが実際に実行して確認してるものと、違うのですかね
jbpb0

2022/12/01 01:00 編集

> for i in range(int(hit/2)):img_bgr[i] = img_bgr[i] / 2 は、画像の上半分を暗くしてるようですが、この質問の内容とは関係無いですよね この処理は要るのですか?
jbpb0

2022/11/30 11:10 編集

> hsv_min = np.array([ 20, 64, 0]) と、V(明るさ)の下限を「0」にすると、たとえば木の幹のようにかなり暗くて(黒に近くて)、目視ではどんな色かよく分からないものも色判定の対象になってしまいます 実際、質問のmask画像を見ると、木の幹で「黄色」と判定されてる部分が多いようです Vの下限をもう少し大きくして、木の幹のようにかなり暗いところは色判定から除外されるようにした方がいいのではないですかね なお、Vの範囲を変える場合は、下記はやらない方がいいと思いますよ > for i in range(int(hit/2)):img_bgr[i] = img_bgr[i] / 2
退会済みユーザー

退会済みユーザー

2022/12/01 02:47

jbpb0さん何度もありがとうございます。 変更したところうまくいきました!!
jbpb0

2022/12/17 02:43

私の回答で解決しませんでしょうか?
guest

回答1

0

maskは2次元なので、「sum(mask)」は一つの値ではなく、画像の横方向の画素数と同じ要素数の配列になるはずです

「sum(mask)」じゃなくて「np.sum(mask)」なら一つの値になりますので、質問の現在の画像をダウンロードして、質問のコードを「np.sum(mask)」に変えて、「hit」と「wid」に画像の縦・横方向の画素数をそれぞれ入れて、他はそのままで実行したら、
Rust ratio is : 78.22978741277834 %
となり、

35%と出ており

とはなりませんでした

投稿2022/12/01 05:15

jbpb0

総合スコア7651

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問