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

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

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

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

OpenCV

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

Python

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

Q&A

解決済

1回答

1011閲覧

Opencvを利用した特定の領域における画素の算出 グラフがplotされません(何度も質問申し訳ありません。使い方が分かってきたので連投させていただきます)

退会済みユーザー

退会済みユーザー

総合スコア0

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

OpenCV

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

Python

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

0グッド

0クリップ

投稿2019/05/23 08:40

指定した領域の画素値のプロット

何度も質問申し訳ありません。使い方が分かってきたので連投させていただきます。

私は今、ある18000フレームの動画をとっており、その動画内の特定の領域の発光強度を測定するプログラムをopencvを使って作っています。

作業として、指定した領域の最初の1フレームの各ピクセルごとの強度(R,G,Bを3で割る)を出し、それらを全て足し合わせ、全ピクセルの数で割り、これを18000フレームまで繰り返し行ないます。1フレームの強度を表す式は具体的に以下の式となります。

![イメージ説明

横軸をフレーム数、縦軸を強度(Intensity)を示したグラフをプロットしたいのですが何もプロットされません。
以下のプログラムを作成し、実行してみました。何か間違えているところがあればよろしくお願い致します

from numpy import * import cv2 import matplotlib.pyplot as plt import numpy as np video_path = "movie.mkv" cap = cv2.VideoCapture(video_path) numS=raw_input("start frame: ") numS=int(numS) numE=raw_input("end frame: ") numE=int(numE) # 場所を決める xmin=raw_input("左上のx座標:") ymin=raw_input("左上のy座標:") xmax=raw_input("右下のx座標:") ymax=raw_input("右下のy座標:") Xmin=int(xmin) Ymin=int(ymin) Xmax=int(xmax) Ymax=int(ymax) #初期ベクトルの設定 vIu=zeros((0)) # empty vector for idx in range(numS,numE): cap.set(cv2.CAP_PROP_POS_FRAMES, idx) res, fr = cap.read() In=0 for i in range(Xmin,Xmax+1): for j in range(Ymin,Ymax+1): val =fr[i,j] I=sum(val)/3 In +=I Intensity=In/((Xmax-Xmin+1)*(Ymax-Ymin+1)) Intensity=append(vIu,Intensity) print(Intensity) print "flame number",idx plt.plot(Intensity,linewidth=1,color="r") plt.grid(True) plt.xlabel("number of frame") plt.ylabel("intensity of PL") plt.legend(fontsize=17) plt.xlim(numS,numE) plt.ylim(0,255) plt.show()

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

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

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

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

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

tiitoi

2019/05/23 09:27

以前にした質問のうち、解決または不要となったものはクローズしてください。
guest

回答1

0

ベストアンサー

平均の計算の部分は for 文を使わなくとも、
frame[ymin:ymax, xmin:xmax].mean() でいいと思います。

python

1import cv2 2import matplotlib.pyplot as plt 3import numpy as np 4 5video_path = "Desktop/test.mp4" 6cap = cv2.VideoCapture(video_path) 7 8start = 0 # 開始フレーム No (include) 9end = 100 # 終了フレーム No (exclude) 10xmin, ymin = 10, 10 # 検出対象の矩形の左上の座標 (include) 11xmax, ymax = 20, 20 # 検出対象の矩形の右下の座標 (exclude) 12 13# フレーム [start, end) の範囲で各フレームの [ymin, ymax)x[xmin, xmax) の画素の平均を計算する。 14frame_no = np.arange(start, end) 15intensities = [] 16for i in frame_no: 17 # フレーム i を取得する。 18 cap.set(cv2.CAP_PROP_POS_FRAMES, i) 19 ret, frame = cap.read() 20 if not ret: 21 print('Failed to grab frame.') 22 break 23 # 平均画素値を計算する。 24 intensities.append(frame[ymin:ymax, xmin:xmax].mean()) 25 26# 描画する。 27fig, ax = plt.subplots() 28ax.plot(frame_no, intensities, lw=1, color='r') 29ax.grid() 30ax.set_xlabel('Frame') 31ax.set_ylabel('Intensity of PL') 32ax.legend(fontsize=17) 33ax.set_ylim(0, 255) 34plt.show()

イメージ説明

追記

縦方向がx で横方向がyではないのですか? 画像処理は左上を原点にして、縦がx軸、横がy軸と聞いたのですが、、、

左上原点は正しいですが、縦が y 軸、横が x 軸というのは変わりません。

イメージ説明

投稿2019/05/23 09:19

編集2019/05/23 10:30
tiitoi

総合スコア21956

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

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

退会済みユーザー

退会済みユーザー

2019/05/23 09:54

ありがとうございます。 frame[ymin:ymax, xmin:xmax] を行なうことで、指定した範囲内における各ピクセルのRGB値が出て それを3で割る。すなわちmean関数で平均を出す解釈でよろしいでしょうか?
tiitoi

2019/05/23 09:59

カラー画像 (動画のフレーム) は (height, width, 3) の numpy 配列で表されます。 frame[ymin:ymax, xmin:xmax] とした場合、画像のうち、縦方向は画素 ymin ~ ymax - 1, 横方向は xmin ~ xmax - 1 の範囲の部分配列が作成されます。 I(t) の式を見たところ、この範囲の画素値の平均をとっていると解釈できるので、この部分配列の平均値を mean() で計算すれば、I(t) が求められます。
tiitoi

2019/05/23 10:06 編集

ちなみに式の分母は 3(x2 - x1 + 1)(y2 - y1 + 1) の間違いではないでしょうか。 例えば、x1 = 0, x2 = 1, y1 = 0, y2 = 1 の場合、その範囲の画素数は 2x2 の4ですが、(x2 - x1)(y2 - y1)は1となってしまいます。
退会済みユーザー

退会済みユーザー

2019/05/23 10:11

ありがとうございます。ご指摘どおり、ピクセル数なので1足したもの同士を掛け合わせることになります。 縦方向は画素 ymin ~ ymax - 1, 横方向は xmin ~ xmax - 1 の範囲の部分配列が作成とあるのですが、 縦方向がx で横方向がyではないのですか? 画像処理は左上を原点にして、縦がx軸、横がy軸と聞いたのですが、、、、
tiitoi

2019/05/23 10:32 編集

追記の画像の通り、画像座標系でも横がx軸、縦がy軸です。 画像を表す numpy 配列は 縦x横xチャンネル数なので、切り出す場合は frame[縦方向の範囲, 横方向の範囲] となります。
退会済みユーザー

退会済みユーザー

2019/05/23 10:43

最後に1つだけ質問ですが、試しに上のintensitiesをprint関数を使うことで以下のように画素値が表示されたのですが(10×10で合計121個のピクセル)、どのピクセルの画素値かどうかは分かりませんよね? [array([[[17, 13, 16], [17, 13, 16], [15, 11, 14], [15, 11, 14], [17, 13, 16], [18, 14, 17], [15, 15, 15], [15, 15, 15], [13, 13, 13], [12, 12, 12], [12, 12, 12]], [[17, 13, 16], [15, 11, 14], [14, 10, 13], [14, 10, 13], [15, 11, 14], [17, 13, 16], [15, 15, 15], [15, 15, 15], [15, 15, 15], [13, 13, 13], [11, 11, 11]], [[15, 11, 14], [14, 10, 13], [13, 9, 12], [13, 9, 12], [15, 11, 14], [17, 13, 16], [15, 15, 15], [15, 15, 15], [15, 15, 15], [13, 13, 13], [11, 11, 11]], [[15, 11, 14], [14, 10, 13], [13, 9, 12], [13, 9, 12], [15, 11, 14], [17, 13, 16], [15, 15, 15], [16, 16, 16], [16, 16, 16], [13, 13, 13], [11, 11, 11]], [[14, 9, 15], [13, 8, 14], [13, 9, 12], [13, 9, 12], [13, 9, 12], [14, 10, 13], [12, 12, 12], [12, 12, 12], [12, 12, 12], [12, 12, 12], [11, 11, 11]], [[14, 9, 15], [13, 8, 14], [13, 9, 12], [13, 9, 12], [13, 9, 12], [14, 10, 13], [13, 13, 13], [12, 12, 12], [12, 12, 12], [12, 12, 12], [11, 11, 11]], [[14, 9, 15], [13, 8, 14], [13, 9, 12], [13, 9, 12], [14, 10, 13], [14, 10, 13], [13, 13, 13], [13, 13, 13], [13, 13, 13], [12, 12, 12], [12, 12, 12]], [[14, 9, 15], [13, 8, 14], [13, 9, 12], [14, 10, 13], [14, 10, 13], [15, 11, 14], [15, 15, 15], [13, 13, 13], [13, 13, 13], [13, 13, 13], [12, 12, 12]], [[14, 9, 15], [13, 8, 14], [13, 9, 12], [14, 10, 13], [15, 11, 14], [15, 11, 14], [15, 15, 15], [15, 15, 15], [15, 15, 15], [13, 13, 13], [13, 13, 13]], [[13, 8, 14], [13, 8, 14], [13, 9, 12], [14, 10, 13], [15, 11, 14], [17, 13, 16], [16, 16, 16], [16, 16, 16], [15, 15, 15], [15, 15, 15], [15, 15, 15]], [[13, 9, 12], [13, 9, 12], [13, 9, 12], [14, 10, 13], [15, 11, 14], [17, 13, 16], [16, 16, 16], [16, 16, 16], [16, 16, 16], [16, 16, 16], [15, 15, 15]]], dtype=uint8)]
tiitoi

2019/05/23 12:37 編集

> どのピクセルの画素値かどうかは分かりませんよね? わかりますよ print したのは、intensities ではなく、frame[ymin:ymax, xmin:xmax] ですよね? 切り出した部分配列 x が (H, W, C) の形状だった場合、 x[i, j] がその領域の (i, j) 成分の RGB 値を表します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問