回答編集履歴

2

d

2020/02/03 15:24

投稿

tiitoi
tiitoi

スコア21956

test CHANGED
@@ -139,3 +139,139 @@
139
139
 
140
140
 
141
141
  ![イメージ説明](6207e9a6f6bec1e7211fc1fec757aa6b.png)
142
+
143
+
144
+
145
+ ## 追記
146
+
147
+
148
+
149
+ > 1フレームの強度の振れ幅がピクセルごとに違うので、正規化を行いたいと思います。
150
+
151
+
152
+
153
+ チャンネルごとに平均をとって、(フレーム数, 高さ, 幅) の配列を作ったあと、axis=0 方向、つまり、画素ごとに [-1, 1] の範囲に正規化を行えばよいです。
154
+
155
+
156
+
157
+ ```python
158
+
159
+ import time
160
+
161
+ from urllib.request import urlretrieve
162
+
163
+
164
+
165
+ import cv2
166
+
167
+ import matplotlib.pyplot as plt
168
+
169
+ import numpy as np
170
+
171
+
172
+
173
+ start = time.time()
174
+
175
+
176
+
177
+ # サンプル用動画をダウンロードする。
178
+
179
+ video_path = "sample.avi"
180
+
181
+ video_url = "https://github.com/opencv/opencv/raw/master/samples/data/vtest.avi"
182
+
183
+ urlretrieve(video_url, video_path)
184
+
185
+
186
+
187
+ # 動画の全フレームを読み込む。
188
+
189
+ cap = cv2.VideoCapture(video_path)
190
+
191
+ # 1フレームずつ取得する。
192
+
193
+ imgs = []
194
+
195
+ while True:
196
+
197
+ ret, frame = cap.read()
198
+
199
+ if not ret:
200
+
201
+ break
202
+
203
+ imgs.append(frame)
204
+
205
+
206
+
207
+ # チャンネルごとに平均をとる。
208
+
209
+ mean = np.mean(imgs, axis=-1)
210
+
211
+ del imgs # メモリ節約のため、不要になったので、削除する。
212
+
213
+ print(mean.shape) # (795, 576, 768)
214
+
215
+
216
+
217
+ # 範囲を [-1, 1] にする。
218
+
219
+ mins, maxs = mean.min(axis=0), mean.max(axis=0)
220
+
221
+
222
+
223
+ # メモリ節約のため、演算はインラインで行う。
224
+
225
+ mean -= mins
226
+
227
+ mean *= 2 / (maxs - mins)
228
+
229
+ mean -= 1
230
+
231
+
232
+
233
+ # ピクセルごとに相関係数を計算する。
234
+
235
+ x0, y0 = 10, 10 # 対称とする点
236
+
237
+
238
+
239
+ h, w = mean.shape[1:3] # 画像の幅、高さ
240
+
241
+ vec1 = mean[:, y0, x0]
242
+
243
+
244
+
245
+ corr_img = np.empty((h, w))
246
+
247
+ for y in range(h):
248
+
249
+ for x in range(w):
250
+
251
+ vec2 = mean[:, y, x]
252
+
253
+ # 相関行列を計算する。
254
+
255
+ C = np.corrcoef(vec1, vec2)
256
+
257
+ corr_img[y, x] = C[0, 1] # x, y の相関係数
258
+
259
+
260
+
261
+ print(f"Done! {time.time() - start}s") # 66.96258449554443s
262
+
263
+
264
+
265
+ fig, ax = plt.subplots()
266
+
267
+ ax.imshow(corr_img)
268
+
269
+
270
+
271
+ plt.show()
272
+
273
+ ```
274
+
275
+
276
+
277
+ ![イメージ説明](5f42136432d9d6ef02528582405ba2c5.png)

1

d

2020/02/03 15:23

投稿

tiitoi
tiitoi

スコア21956

test CHANGED
@@ -90,7 +90,7 @@
90
90
 
91
91
  mean_imgs = np.mean(imgs, axis=-1)
92
92
 
93
- print(mean_imgs.shape) # (795, 576, 768, 3)
93
+ print(mean_imgs.shape) # (795, 576, 768)
94
94
 
95
95
 
96
96