Tifffile vs Opencv in Python
If you’re using opencv and/or tifffile to prepare your dataset for training deep learning models, beware the difference between the imread function in both libraries, i.e.,
tifffile.imread. It makes a huge difference, especially if you have custom, multi-channel images.
Let’s experiment with an example custom tif image with dimensions 224x224x4 below.
# import necessary modules import cv2 import tifffile import matplotlib.pyplot as plt %matplotlib inline # read image with tifffile image_tifffile = tifffile.imread('example.tif') print(image_tifffile.shape) # prints 224x224x4
(224, 224, 4)
# read image with cv2 image_cv2 = cv2.imread('example.tif', cv2.IMREAD_UNCHANGED) print(image_cv2.shape) # also prints 224x224x4
(224, 224, 4)
Looks great, the same image read with both libraries are read and have the same size. However, there is a twist. Let’s use
matplotlib and plot all four slices for the image read by both libraries.
# plot all four slices for both images read above fig, ax = plt.subplots(2, 4) for i in range(4): ax[0, i].imshow(image_tifffile[:,:,i], cmap='gray') ax[1, i].imshow(image_cv2[:,:,i], cmap='gray') for axi in ax.ravel(): axi.set_axis_off() plt.show()
The first row shows the four slices for the image read with tifffile. The second row shows the same, but read with opencv (cv2)
Opencv swaps channels 1 and 3. I learned it the hard way, and wanted to give you a heads-up! I hope you enjoyed reading.