It also gives a clue on how to process batch series of images
from openpiv import tools, pyprocess, scaling, validation, filters
import numpy as np
import glob
import matplotlib.pyplot as plt
%matplotlib inline
%load_ext watermark
%watermark -v -m -p numpy,openpiv -g -b
Python implementation: CPython Python version : 3.8.12 IPython version : 8.4.0 numpy : 1.23.1 openpiv: 0.24.4rc0 Compiler : GCC 4.8.5 20150623 (Red Hat 4.8.5-44) OS : Linux Release : 5.4.0-131-generic Machine : x86_64 Processor : x86_64 CPU cores : 8 Architecture: 64bit Git hash: c3168c48f2833af3f999904b13ca54107f1e9dfa Git branch: main
# set of typical parameters
window_size = 32 # pixels 32 x 32 pixels interrogation window, in frame A.
overlap = 16 # overlap is 8 pixels, i.e. 25% of the window
search_size = 40 # pixels 64 x 64 in frame B, avoids some peak locking for
# large displacements
def openpiv_default_run(im1, im2, window_size, overlap, search_size):
""" default settings for OpenPIV analysis using
extended_search_area_piv algorithm for two images
Inputs:
im1,im2 : str,str = path of two image
"""
frame_a = tools.imread(im1)
frame_b = tools.imread(im2)
u, v, sig2noise = pyprocess.extended_search_area_piv(frame_a.astype(np.int32),
frame_b.astype(np.int32),
window_size=window_size,
overlap=overlap,
dt=1,
search_area_size=search_size,
sig2noise_method='peak2mean',
correlation_method='circular',
normalized_correlation=True)
x, y = pyprocess.get_rect_coordinates(frame_a.shape,
search_size,
overlap)
# 5% lowest range
invalid_mask = validation.sig2noise_val(
sig2noise,
threshold = np.percentile(sig2noise,2.5)
)
u, v = filters.replace_outliers( u, v, invalid_mask, method='localmean',
max_iter=3, kernel_size=3)
x, y, u, v = scaling.uniform(x, y, u, v, scaling_factor = 1. )
x, y, u, v = tools.transform_coordinates(x, y, u, v)
tools.save(list_of_images[0]+'.txt', x, y, u, v)
fig,ax = plt.subplots(figsize=(8,8))
ax.set_title(im1+'.txt')
tools.display_vector_field(im1+'.txt',
on_img=True,image_name=list_of_images[0],
scaling_factor=1.,
ax=ax)
# tools.display_vector_field(list_of_images[0]+'.txt',
# scaling_factor=1.,
# ax=ax[1])
alist_filter = ['jpg','bmp','png','tif','tiff']
# all test cases in /openpiv/examples/
list_of_tests = glob.glob('../test*')
list_of_tests.sort()
list_of_images = []
for test in list_of_tests:
list_of_files = glob.glob(test+'/*.*')
list_of_files.sort()
list_of_images = [f for f in list_of_files if f[-3:] in alist_filter]
if len(list_of_images) > 1:
openpiv_default_run(list_of_images[0],list_of_images[1],window_size, overlap, search_size)
/home/user/.edm/envs/echopiv/lib/python3.8/site-packages/matplotlib/quiver.py:635: RuntimeWarning: Mean of empty slice. amean = a.mean() /home/user/.edm/envs/echopiv/lib/python3.8/site-packages/numpy/core/_methods.py:190: RuntimeWarning: invalid value encountered in double_scalars ret = ret.dtype.type(ret / rcount)
# rectangular windows
window_size = [16, 32] # pixels 24 x 32 pixels interrogation window, in frame A.
overlap = [8, 16] # overlap is [12 x 16] , 50%
search_size = [40, 40] # search size is larger than the window size to get also some large displacements
list_of_images = []
for test in list_of_tests:
list_of_files = glob.glob(test+'/*.*')
list_of_files.sort()
list_of_images = [f for f in list_of_files if f[-3:] in alist_filter]
if len(list_of_images) > 1:
openpiv_default_run(list_of_images[0],list_of_images[1], window_size, overlap, search_size)