質問するログイン新規登録

Q&A

解決済

1回答

2102閲覧

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

退会済みユーザー

退会済みユーザー

総合スコア0

Jupyter

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

JupyterLab

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

OpenCV

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

Python

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

0グッド

0クリップ

投稿2022/11/22 06:19

編集2022/11/22 07:37

0

0

前提

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

実現したいこと

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

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


以下のようなエラーが出ています。
NameError Traceback (most recent call last) ~\AppData\Local\Temp\ipykernel_30076\3627228303.py in <module> 16 17 # 出現回数(ピクセル数)をカウントする ---> 18 counter = collections.Counter(color_list) 19 20 # ピクセル数と色をpandasデータフレーム化 NameError: name 'collections' is not defined

該当のソースコード

以下のコードを作成しました。

python

1import numpy as np 2import cv2 3from matplotlib import pyplot as plt 4img = cv2.imread('pic-20221101T004942Z.png') 5h, w, _ = img.shape 6 7 #全画素の色リストを作成 8 #色情報は B*1000000 + G*1000 + R に変換し 90埋めした9桁の文字列に  10color_list = [] 11for y in range(h): 12 for x in range(w): 13 color_list.append(str(img[y, x, 0]*1000000 + 14 img[y, x, 1]*1000 + 15 img[y, x, 2]).zfill(9)) 16 17 #出現回数(ピクセル数)をカウントする 18counter = collections.Counter(color_list) 19 20 #ピクセル数と色をpandasデータフレーム化 21df = pd.DataFrame(data=[list(counter.values()), list(counter.keys())], 22 index = ['pixels', 'BGR']).T 23 24 #ピクセル数が全体の1%未満の行を削除(ノイズとみなす) 25df2 = df[df['pixels'] > h*w*0.01] 26 27 #降順に並べ替え 28df3 = df2.sort_values(by=['pixels'], ascending=False) 29 30 #ndarrayに変換し一行ずつ読み出しリストに追加 31 #色情報は9桁の文字列なので3文字ずつ読み出し 32255で割って01の数字に変換 33 #順番をBGR→RGBに変更 34x_list =[] 35rgb_list =[] 36for i in df3.to_numpy(): 37 x_list.append(i[0]) 38 rgb_list.append([int(i[1][6:9])/255, 39 int(i[1][3:6])/255, 40 int(i[1][0:3])/255]) 41 42#円グラフの作成 43plt.pie(x_list, 44 colors=rgb_list, 45 wedgeprops={'linewidth': 1, 'edgecolor':'black'}, 46 counterclock=None, 47 startangle=90) 48plt.show() 49

参考にしたサンプルコード

https://tat-pytone.hatenablog.com/entry/2022/04/25/203755
https://miseruit.com/2022/09/27/post-3447/

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

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

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

can110

2022/11/22 06:43

カレントディレクトリに読込ファイル(~.png)はたしかに存在するでしょうか?
退会済みユーザー

退会済みユーザー

2022/11/22 06:49

はい、確かに存在していると認識しております。 現在はimg = cv2.imread('pic-20221101T004942Z.jpg')で行っており、 --------------------------------------------------------------------------- NameError Traceback (most recent call last) ~\AppData\Local\Temp\ipykernel_30076\3627228303.py in <module> 16 17 # 出現回数(ピクセル数)をカウントする ---> 18 counter = collections.Counter(color_list) 19 20 # ピクセル数と色をpandasデータフレーム化 NameError: name 'collections' is not defined 上記のようなエラーが出ております。
can110

2022/11/22 07:05

エラーメッセージが異なるようですので質問本文を修正ください。 また、インデントがなくなっているのでソースコードはコードブロックで囲んでください。 なおcollectionsはimportしているでしょうか?
jbpb0

2022/11/22 07:20

pythonのコードの一番最初の行のすぐ上に ```python だけの行を追加してください また、pythonのコードの一番最後の行のすぐ下に ``` だけの行を追加してください または、 https://teratail.storage.googleapis.com/uploads/contributed_images/56957fe805d9d7befa7dba6a98676d2b.gif を見て、そのようにしてみてください 現状、コードがとても読み辛いです 質問にコードを載せる際に上記をやってくれたら、他人がコードを読みやすくなり、コードの実行による現象確認もやりやすくなるので、回答されやすくなります
退会済みユーザー

退会済みユーザー

2022/11/22 07:36

can110様jbpb0様 このような仕様にできることを初めて知りました。 ありがとうございます。
guest

この質問の投稿者はすでに退会しているため、質問者からの返信がない点にご留意ください。

回答1

0

ベストアンサー

Markdownを使用していないので、質問文にコピペした際に欠損したの
かもしれませんが、提示されたプログラムでは

python

1# ピクセル数が全体の1%未満の行を削除(ノイズとみなす) 2df2 = df[df['pixels'] > hw0.01]

と書かれていますが、コピペ元では

python

1df2 = df[df['pixels'] > h*w*0.01]

と書いてあります。
上記を修正して、インデント付けたり足りないimportを追加
したりしたら、なんとなく動いた気がするのでご確認下さい。

ちなみに、コピペ元のサイトでは国旗のような色数が多くない
べた塗り画像で色の割合を求めていますが、実行してみた感じだと
色数が多い写真系の画像ではうまく行かないかもしれません。
プログラムの動作確認はコピペ元の国旗画像で行っていただくと
良いかと思います。

※ 「質問へのコメント」で、最初の質問と別のエラーが書いてありますが、
collectionsがないのは「import collections」してください

投稿2022/11/22 06:59

poto568

総合スコア373

退会済みユーザー

退会済みユーザー

2022/11/22 07:34

何から何までありがとうございます。参考にさせていただき実施したところ File "~AppData\Local\Temp\ipykernel_30076\4145440289.py", line 26 df2 = df[df['pixels'] > hw 0.01] ^ SyntaxError: invalid syntax 上記のようなエラーが出たのですが何が悪いかわかりますでしょうか…。 国旗画像に変更も行いました。
poto568

2022/11/22 08:15

df2 = df[df['pixels'] > hw 0.01] とすると、うちの環境でもSyntaxErrorになりますね。 「編集 2022/11/22 16:37」で記載されている質問文のpythonのソースコードでは h と w と 0.01 の間にそれぞれ半角の*が入っています。コメント欄の機能の問題なのか 現状では判断できませんので、念のためご確認下さい。
退会済みユーザー

退会済みユーザー

2022/11/22 09:17

入れてみると --------------------------------------------------------------------------- NameError Traceback (most recent call last) ~\AppData\Local\Temp\ipykernel_30076\3831213342.py in <module> 20 21 # ピクセル数と色をpandasデータフレーム化 ---> 22 df = pd.DataFrame(data=[list(counter.values()), list(counter.keys())], 23 index = ['pixels', 'BGR']).T 24 NameError: name 'pd' is not defined 上記のようなエラーがでました。 *をつけるとひとまずその部分に関してはエラーがなくなったように思えます。
退会済みユーザー

退会済みユーザー

2022/11/22 09:23

上記のようなエラーは何が原因だと考えられますでしょうか。 何度も申し訳ないのですがご教授いただければ幸いです。
jbpb0

2022/11/28 02:23 編集

> NameError: name 'pd' is not defined 質問者さんが参考にしてる https://tat-pytone.hatenablog.com/entry/2022/04/25/203755 のコードには import pandas as pd がありますが、この質問の「該当のソースコード」にはありません コードに上記を追加したら直ると思いますけど、なぜその行を含めてないのでしょうか? 【追記】 質問者さん コードに「import pandas as pd」を追加しても、エラーが直らないのでしょうか?
guest

この質問の投稿者はすでに退会しているため、質問者からの返信やベストアンサーの選定がない点にご留意ください。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.25%

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

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

質問する

関連した質問