Dear PIV community,
I am trying to trace the displacement of a certain point in a list of images (from a vedio).
First, I refer to the example provided in notebooks:
Since the velocity (displacement) field generated by OpenPIV is in Eulerian specification,
I cannot simply conduct "Umean = np.sum(U, axis=0)" for the results in time sequence.
What I can do is to conduct time integration using Finite Difference Methods.
Two concerns on this process are included:
1. Spatial interpolation needs to be conducted by me;
2. Random walk errors accumulates in the process.
According to some previous theads:
it seems that winde.py can realize the demand.
I had some trials on the given examples, which works on two images:
They works well, so I have a trial on a list of images.
My codes are as follow:
========================
# import packages
from openpiv import windef # <---- see windef.py for details
from openpiv import tools, scaling, validation, filters, preprocess
import openpiv.pyprocess as process
from openpiv import pyprocess
import numpy as np
import pathlib
import importlib_resources
from time import time
import warnings
import matplotlib.pyplot as plt
#Set up all the settings
settings = windef.PIVSettings()
path = pathlib.Path('.../test/multi-grid')
'Data related settings'
# Folder with the images to process
settings.filepath_images = path / 'input' # type: ignore
# Folder for the outputs
settings.save_path = path / 'output' # type: ignore
# Root name of the output Folder for Result Files
settings.save_folder_suffix = 'Test'
# Format and Image Sequence (see below for more options)
settings.frame_pattern_a = 'IMG_010*.jpg'
settings.frame_pattern_b = '(1+2),(2+3)'
'Region of interest'
# (50,300,50,300) #Region of interest: (xmin,xmax,ymin,ymax) or 'full' for full image
settings.roi = (500,2000,625,1200)
'Image preprocessing'
# 'None' for no masking, 'edges' for edges masking, 'intensity' for intensity masking
# WARNING: This part is under development so better not to use MASKS
settings.dynamic_masking_method = 'None'
settings.dynamic_masking_threshold = 0.005
settings.dynamic_masking_filter_size = 7
settings.deformation_method = 'symmetric'
'Processing Parameters'
settings.correlation_method='circular' # 'circular' or 'linear'
settings.normalized_correlation=False
settings.num_iterations = 2 # select the number of PIV passes
# add the interroagtion window size for each pass.
# For the moment, it should be a power of 2
settings.windowsizes = (64, 32, 16) # if longer than n iteration the rest is ignored
# The overlap of the interroagtion window for each pass.
settings.overlap = (32, 16, 8) # This is 50% overlap
# Has to be a value with base two. In general window size/2 is a good choice.
# methode used for subpixel interpolation: 'gaussian','centroid','parabolic'
settings.subpixel_method = 'gaussian'
# order of the image interpolation for the window deformation
settings.interpolation_order = 3
settings.scaling_factor = 20 # scaling factor pixel/meter
settings.dt = 1 # time between to frames (in seconds)
'Signal to noise ratio options (only for the last pass)'
# It is possible to decide if the S/N should be computed (for the last pass) or not
# settings.extract_sig2noise = True # 'True' or 'False' (only for the last pass)
# method used to calculate the signal to noise ratio 'peak2peak' or 'peak2mean'
settings.sig2noise_method = 'peak2peak'
# select the width of the masked to masked out pixels next to the main peak
settings.sig2noise_mask = 2
# If extract_sig2noise==False the values in the signal to noise ratio
# output column are set to NaN
#'vector validation options'
# choose if you want to do validation of the first pass: True or False
settings.validation_first_pass = True
# only effecting the first pass of the interrogation the following passes
# in the multipass will be validated
'Validation Parameters'
# The validation is done at each iteration based on three filters.
# The first filter is based on the min/max ranges. Observe that these values are defined in
# terms of minimum and maximum displacement in pixel/frames.
settings.min_max_u_disp = (-30, 30)
settings.min_max_v_disp = (-30, 30)
# The second filter is based on the global STD threshold
settings.std_threshold = 7 # threshold of the std validation
# The third filter is the median test (not normalized at the moment)
settings.median_threshold = 3 # threshold of the median validation
# On the last iteration, an additional validation can be done based on the S/N.
settings.median_size=1 #defines the size of the local median
'Validation based on the signal to noise ratio'
# Note: only available when extract_sig2noise==True and only for the last
# pass of the interrogation
# Enable the signal to noise ratio validation. Options: True or False
# settings.do_sig2noise_validation = False # This is time consuming
# minmum signal to noise ratio that is need for a valid vector
settings.sig2noise_threshold = 1.2
'Outlier replacement or Smoothing options'
# Replacment options for vectors which are masked as invalid by the validation
settings.replace_vectors = True # Enable the replacment. Chosse: True or False
settings.smoothn=True #Enables smoothing of the displacemenet field
settings.smoothn_p=0.5 # This is a smoothing parameter
# select a method to replace the outliers: 'localmean', 'disk', 'distance'
settings.filter_method = 'localmean'
# maximum iterations performed to replace the outliers
settings.max_filter_iteration = 4
settings.filter_kernel_size = 2 # kernel size for the localmean method
'Output options'
# Select if you want to save the plotted vectorfield: True or False
settings.save_plot = False
# Choose wether you want to see the vectorfield or not :True or False
settings.show_plot = True
settings.scale_plot = 25 # select a value to scale the quiver plot of the vectorfield
# run the script with the given settings
windef.piv(settings)
========================
Sadly, the code doesn't work, reporting "Something happened in the validation".
I had a trial on the first two figures, by only replacing the following part:
========================
settings.frame_pattern_a = 'IMG_0100.jpg'
settings.frame_pattern_a = 'IMG_0101.jpg'
========================
It failed, reporting "index 0 is out of bounds for axis 0 with size 0".
When I tried:
========================
settings.roi = 'full'
========================
it fialed reprting "operands could not be broadcast together with shapes (4725,64,33) (140,64,33) "
I had a trial with the images in the provided tutourials (images are downloaded to the same local folder),
by only replacing the following parts:
========================
settings.frame_pattern_a = 'exp1_001_a.bmp'
settings.frame_pattern_b = 'exp1_001_b.bmp'settings.roi = 'full'
========================
or
========================
settings.frame_pattern_a = 't_23.png'
settings.frame_pattern_b = 't_24.png'
settings.roi = 'full'
========================
both works well.
I am confused whether the windef.py has a problem on the input file type.
In addition, I cannot find an example for the windef dealing with a list of images.
I wonder whether such an example is available.
Best regards,
Wenyue Zhang