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

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

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

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

OpenCV

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

Python

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

Q&A

解決済

1回答

689閲覧

写真上でカウントしたものをグラフにするには

21J

総合スコア5

Matplotlib

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

OpenCV

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

Python

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

0グッド

0クリップ

投稿2020/12/22 09:43

前提・実現したいこと

Pythonを使っています
画像内に様々な色の粒子がある画像を読み込み画像内の粒子の数をヒストグラムにし表したいです。
画像内の粒子をカウントすることまでは行えたのですが、そこからグラフを書くことができません。

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

該当のソースコード

Python
ソースコード

import cv2
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.patches import Polygon

img=cv2.imread('E:/opencv/104.png')

hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) # HSV 色空間に変換

red = cv2.inRange(hsv, np.array([0, 120, 200]), np.array([30, 255, 255]))
green = cv2.inRange(hsv, np.array([30, 120, 200]), np.array([90, 255, 255]))
blue = cv2.inRange(hsv, np.array([90, 121, 204]), np.array([150, 255, 255]))

白だけゴミがあるので、収縮演算

kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))

bin_imgs = {'syou': red, 'tyuu': green,

... 'dai': blue,}

2値化結果を可視化する。

####################################################
fig, axes_list = plt.subplots(3, 1, figsize=(10, 18))
for ax, (label, bin_img,) in zip(axes_list.ravel(), bin_imgs.items()):

... ax.axis('off')
... ax.set_title(label)
... ax.imshow(bin_img, cmap=plt.cm.gray)
...
(0.0, 1.0, 0.0, 1.0)
Text(0.5, 1.0, 'syou')
<matplotlib.image.AxesImage object at 0x000002A98C8C2580>
(0.0, 1.0, 0.0, 1.0)
Text(0.5, 1.0, 'tyuu')
<matplotlib.image.AxesImage object at 0x000002A98C8FB9A0>
(0.0, 1.0, 0.0, 1.0)
Text(0.5, 1.0, 'dai')
<matplotlib.image.AxesImage object at 0x000002A98C92ADC0>

fig, ax = plt.subplots(figsize=(12, 10))
ax.axis('off')

(0.0, 1.0, 0.0, 1.0)

ax.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))

<matplotlib.image.AxesImage object at 0x000002A98C94D700>

輪郭検出し、数を求める。

for label, bin_img in bin_imgs.items():

... contours, _ = cv2.findContours(bin_img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
... count = len(contours)
... print('color: {}, conunt: {}'.format(label, count))
...
color: syou, conunt: 0
color: tyuu, conunt: 3
color: dai, conunt: 3

試したこと

補足情報(FW/ツールのバージョンなど)

色により大きさを表したいので大、中、小と表せるようにしてあります

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

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

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

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

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

guest

回答1

0

ベストアンサー

python

1import cv2 2import matplotlib.pyplot as plt 3import glob 4%matplotlib inline 5files = glob.glob("*.png") 6result=[] 7for i in files: 8 img=cv2.imread(i) 9 gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) 10 _,bw = cv2.threshold(gray,120,255,cv2.THRESH_BINARY) 11 #detect the countour 12 contours,hierarchy = cv2.findContours(bw, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) 13 #describe the coutour 14 contimg=cv2.drawContours(img,contours,-1,(0,255,0),3) 15 count = len(contours) 16 result.append(count) 17# Display the result 18plt.imshow(contimg) 19plt.bar(['first','second','third'], result)

上と少し例が違いますが、順に個体数を数えて、最後は棒グラフで示せばいいものと思ったのですが、イメージとあってますでしょうか。

イメージ説明

投稿2020/12/26 06:14

Kenta_py

総合スコア132

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

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

21J

2020/12/28 07:29

回答ありがとうございます。 グラフの作成できました。 グラフ作成の際、'first','first+second','first+second+third'のように累積させたグラフの作成は可能でしょうか?
Kenta_py

2020/12/28 08:09

お役に立てたようでよかったです。 result=[10, 20, 30] cumsumResult=np.cumsum(result, dtype=float) plt.bar(['first','first+second','first+second+third'], result) とすればできます。もう少しかっこいいものがよければ、パレート図 python などで調べてみてください。
21J

2020/12/30 05:53

ありがとうございました。 思っていた通りのグラフを書くことができました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問