摘要:本文介绍并比较了cv2.imread和torchvision.io.read_img两种读取图像的方法。
在通过PytTorch处理图像时,torchvision是一个强有力的工具包。而OpenCV是传统计算机视觉影响力最大的库,在Python中使用numpy对图像处理。它们都提供了读取图像的接口。
本文在实验时分别用了两者的接口读取COCO数据集中的图像,然而,COCO数据集中有彩图和灰度图,两中读图函数在处理时通道数可能不同,导致后续处理时报错。故此,本文梳理比较了二者读取图像API的不同。
Pytorch处理图像的格式为Tensor,read_img函数读取图片时活得的格式便是如此,其各个维度为顺序为[‘C’, ‘H’, ‘W’],分别代表着通道数、图片高度以及宽度。
如果图片本身是黑白的,read_image读取的图片通道数C为1。除此之外,read_image读入的图像每个像素0-255整形。若希望处理范围到[0, 1]之间,则需要手动除以255,如下所示。
img = read_image(img_path) / 255.0
PyTorch处理的图像也常使用OpenCV、PIL等库进行读取。其中,OpenCV读取的图像用numpy数组进行表示,各维度顺序为[‘H’, ‘W’, ‘C’]。如果采取这种方案读取数据,需要将numpy转换为tensor,同时还要将维度的顺序改变。
Pytorch中最常用的方法是使用torchvision.transforms中的ToTensor,这个操作会将一个取值范围在[0,255]的numpy.ndarray图像转换为[0,1.0]的torch.FloadTensor图像,同时各维度的顺序也将自动调整。
与上一节read_image不同,cv2.imread遇到一个黑白图片时,会自动复制成3个通道,除非在传入的参数中指定该图像是一张灰度图(flags设置为cv2.IMREAD_GRAYSCALE),更简单的写法如下:
img = cv2.imread(img_path, 0)