前提
素人なのでご教授いただければ幸いです。
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 に変換し 9 #0埋めした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文字ずつ読み出し 32 #255で割って0~1の数字に変換 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/



回答1件
あなたの回答
tips
プレビュー