nktpgamw
@nktpgamw (onjga)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

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
)
としてもダメでした.

0

1Answer

さらっと目を通しただけですが
https://openpiv.readthedocs.io/en/latest/src/tutorial1.html
ひとまずこちらのチュートリアルにしたがってやってみてはいかがでしょうか。
式26によると引数が異なるようです。

https://openpiv.sourceforge.net/python/src/generated/openpiv.validation.sig2noise_val.html
こちらを参考になさったのかと推察しますが、APIが変更されているみたいですね。
お手元のOpenPIVのバージョンをご確認されるとよいと思います。

0Like

Comments

  1. @nktpgamw

    Questioner

    バージョンは何がいいんでしょうか?

Your answer might help someone💌