PIVの後処理について
解決したいこと
現在openpivを使ってopenpivのチュートリアルで得られたベクトル分布画像へ,誤ベクトルの後処理をしようと考えています.しかし,下記の部分でエラーが発生しています.
u1, v1, mask = validation.sig2noise_val(
u0, v0,
sig2noise,
threshold = 1.05,
)
どなたか解決策などをアドバイスを頂けないでしょうか?
また,その後の
#np.ndarrayをpandas.DataFrameに変換
df = pd.DataFrame(list_02, columns=['X', 'Y', 'U', 'V', 'Mask'])
の部分でも,なぜかlist02の配列が用意したx,y,u,v,maskの5つの配列より1行多く作成されてしまっており,用意した分よりも多いといったエラーが出ます.ここの解決策も教えていただけないでしょうか?
発生している問題・エラー
TypeError: sig2noise_val() got multiple values for argument 'threshold'
該当するソースコード
from openpiv import tools, pyprocess, validation, filters, scaling
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import cv2
k=0
num = 50
while k < num:
print('vecter_'+str(k))
frame_a = tools.imread( 'diff_'+str(k)+'.png' )
frame_b = tools.imread( 'diff_'+str(k+1)+'.png' )
fig,ax = plt.subplots(1,2,figsize=(12,10))
ax[0].imshow(frame_a,cmap=plt.cm.gray);
ax[1].imshow(frame_b,cmap=plt.cm.gray);
winsize = 32
searchsize = 40
overlap = 16
dt = 1/frame_rate
u0, v0, sig2noise = pyprocess.extended_search_area_piv(
frame_a.astype(np.int32),
frame_b.astype(np.int32),
window_size=winsize,
overlap=overlap,
dt=dt,
search_area_size=searchsize,
sig2noise_method='peak2peak',
)
x, y = pyprocess.get_coordinates(
image_size=frame_a.shape,
search_area_size=searchsize,
overlap=overlap,
)
u1, v1, mask = validation.sig2noise_val(
u0, v0,
sig2noise,
threshold = 1.05,
)
u2, v2 = filters.replace_outliers(
u1, v1,
method='localmean',
max_iter=3,
kernel_size=3,
)
x, y, u2, v2 = tools.transform_coordinates(x, y, u2, v2)
tools.save(x, y, u2, v2, mask, 'diff_'+str(k)+'.txt' )
#ベクトルのテキストデータの読み込み
list_01 = np.loadtxt('diff_'+str(k)+'.txt',
skiprows=2, unpack=True)
#配列の転置
list_02 = np.array(list_01).T
#np.ndarrayをpandas.DataFrameに変換
df = pd.DataFrame(list_02, columns=['X', 'Y', 'U', 'V', 'Mask'])
#誤ベクトルの除外
df['U'].where(df['Mask'] == 0, inplace=True)
df['V'].where(df['Mask'] == 0, inplace=True)
#速度ベクトルのスカラー量の取得
UV = np.sqrt(pow(df['U'],2)+pow(df['V'],2))
#スカラー量の最小閾値の設定
UV_min = 2
#特定範囲外のスカラー量の欠損値への置き換え
df['U'].where((np.sqrt(pow(df['U'],2)+pow(df['V'],2)) < UV.max()/10) &
(np.sqrt(pow(df['U'],2)+pow(df['V'],2)) > UV_min),
inplace=True)
df['V'].where((np.sqrt(pow(df['U'],2)+pow(df['V'],2)) < UV.max()/10) &
(np.sqrt(pow(df['U'],2)+pow(df['V'],2)) > UV_min),
inplace=True)
#ベクトルの正規化,大きさの設定
df['U'] = (searchsize - overlap)*df['U']/np.sqrt(pow(df['U'],2)+pow(df['V'],2))
df['V'] = (searchsize - overlap)*df['V']/np.sqrt(pow(df['U'],2)+pow(df['V'],2))
#速度ベクトル分布図の画像の初期化設定
fig = plt.figure()
#速度ベクトルの表示
plt.quiver(df['X'], df['Y'], df['U'], df['V'],
np.sqrt(pow(df['U'],2)+pow(df['V'],2)),
cmap='jet', angles='xy',scale_units='xy',scale=1,)
#グラフの背景画像の読み込み
img_or = cv2.imread(str(k)+'.png')
#画像のPixelサイズの抽出(高さ, 幅, 色)
h, w, _ = img_or.shape
#画像の上下反転
img_t = cv2.flip(img_or, 0)
#グラフ領域の設定
plt.xlim([0,w])
plt.ylim([0,h])
#グラフの背景画像の設定
plt.imshow(img_t, alpha=0.6)
#グラフのグリットの設定
plt.grid()
#グラフの設定の反映
plt.draw()
plt.show()
#速度ベクトル分布図の保存
fig.savefig('vecter_'+str(k),dpi=200,bbox_inches='tight')
k += 1
自分で試したこと
u1, v1, mask = validation.sig2noise_val(
u0, v0,
sig2noise,
threshold = 1.05
)
としてもダメでした.