pythonでの粒子画像の変位ベクトルの算出について
現在openpivを用いて二つの粒子画像中の、それぞれの粒子の変位ベクトルを算出するコードを作ろうと考えています。以下のコードはPIVによる速度ベクトルを取得するコードになっています。おそらく変位ベクトルの算出もPIVと同じ原理で行うことができると考えたのですが、以下のコードをどのように変えれば速度ベクトル算出のコードを変位ベクトルを算出するコードにできるでしょうか?有識者の方々のお力添えを頂きたいです。できれば改訂したコードを記載していただければありがたいです。
該当するソースコード
from openpiv import tools, pyprocess, validation, filters, scaling
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import cv2
import imageio
import importlib_resources
import pathlib
frame_a = tools.imread( "sobel_0.jpg" ,0)
frame_b = tools.imread( "sobel_1.jpg", 0)
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 = 30
searchsize = 40
overlap = 15
dt = 0.02
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,
)
invalid_mask = validation.sig2noise_val(
sig2noise,
threshold = 1.3,
)
u2, v2 = filters.replace_outliers(
u0, v0,
invalid_mask,
method='localmean',
max_iter=3,
kernel_size=3,
)
x, y, u2, v2 = tools.transform_coordinates(x, y, u2, v2)
tools.save('sobel_1.txt', x, y, u2, v2, invalid_mask)
#ベクトルのテキストデータの読み込み
list_01 = np.loadtxt('sobel_1.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', 'Flag', 'Mask'])
Flag = df["Flag"]
U_f = df["U"]
#誤ベクトルの除外
df['U'].where(df['Flag'] == 0, inplace=True)
df['V'].where(df['Flag'] == 0, inplace=True)
#速度ベクトルのスカラー量の取得
UV = np.sqrt(pow(df['U'],2)+pow(df['V'],2))
UV_max=max(UV)
UV_min=min(UV)
#ベクトルの正規化,大きさの設定
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("sobel_1.jpg")
#画像のPixelサイズの抽出(高さ, 幅, 色)
h, w, _ = img_or.shape
#画像の上下反転
img_t = cv2.flip(img_or, 0)
#グラフ領域の設定
plt.xlim([0,w])
plt.ylim([0,h])
cmap = plt.cm.jet
#グラフの背景画像の設定
plt.imshow(img_t, alpha=0.6)
#グラフのグリットの設定
plt.grid()
#グラフの設定の反映
plt.draw()
plt.show()
#速度ベクトル分布図の保存
fig.savefig("vecter_1.jpg",dpi=200,bbox_inches='tight')
0