So, we are neighbors!
I'm studying "down the road" from you, at OSU in Corvallis. Will be happy to help fellow oregonians!
First, I need to acknowledge that I'm doing classical fluid mechanics and I don't have experience with biological flows. I'm having hard time understanding how you conducted your experiment. In particular I don't understand what a "gel tray scattered with the beads" mean. I assume, though, that you are working with a living one-cell microorganism flowing in a viscous gel in some tray. I also assume that your "beads" mean very small particles - which we call PIV particles - which you put in your gel to visualize the flow around your cell.
Now we need to determine what kind of PIV you, actually, did.
If you did - what is called - microPIV, it is whole other story. Note that microPIV doesn't mean that you are working with micro objects, it means that you don't have a light sheet and you are illuminating your entire flow at once.
On the other hand, you wrote that you have 35 slices along z axis. That tells me you did regular PIV, not microPIV.
Now we need to figure out if you really did 3D PIV. Note that 3D PIV doesn't mean that you have many slices along some direction. It is whole other story. 3D PIV is an umbrella name for several special experimental techniques allowing you to obtain 3D velocity vectors at every point in your field. 3D PIV requires its own data-processing functions.
If you have several slices, it doesn't necessarily mean that you did 3D PIV. It means that you did regular 2D PIV at each slice. That being said, note, that there is a way to do 3D PIV using slices but there are several conditions there, one of which is to have a sufficiently small distance between the slices.
Let me assume that you didn't have a sufficiently small distance between your slices. That assumption leads to another assumption: you did regular 2D PIV at every slice.
In this case, you don't need to use OpenPIV 3D capabilities. You can simply use the most basic and easiest OpenPIV function to analyze each of your slices.
Having analyzed them, create a 3D matplotlib.pyplot figure and use python's for loop to quiver plot each of your slice on the same figure.
To do a regular most basic 2D PIV analysis of each of your slices, you can follow this tutorial, for instance:
https://openpiv.readthedocs.io/en/latest/src/tutorial1.html . At the end of that tutorial don't do
tools.display_vector_field. Instead combine your x, y, u3,v3 into a numpy array. Get such an array for each slice. Either stack those arrays into one big array or keep them in a python list. Use for loop to iterate through it to
quiver plot your velocity fields.
With regards to gray-scaling your images, OpenPIV can handle that automatically. I, personally, always do that manually, just to make sure. For that, use opencv python library. Load your image using cv2.imread function like that :
cv2.imread(str(pair[0]), 0) # 0 flag reads in gray scale; str(pair[0]) is the path to your PIV pair of images;
# this function returns an image as a numpy array