PIL和cv2读取读片的区别

在看深度学习代码的时候,发现torch中自定义dataset时,有些采用PIL读取数据,有些采用cv2读取数据,所以想看看二者的区别,以及如何等价代替。


类型对比:

cv2:np.ndarray类型的数据;
PIL:PIL.JpegImagePlugin.JpegImageFile类型的数据;

image1 = cv2.imread(img_path)
image2 = Image.open(img_path)
print(type(image1), type(image2))

# 输出
#  
# 

读取数据维度:

cv2:第一个维度是高度,第二个维度是宽度;
PIL:第一个维度是宽度,第二个维度是高度;

image1 = cv2.imread(img_path)
image2 = Image.open(img_path)
print(image1.shape, image2.size)
# 输出:
# (480, 856, 3) 
# (856, 480)

通道顺序:

cv2:BGR
PIL:RGB


读取时间:

可以发现:PIL读取图片的速度要比cv2读取速度快;

    start = time.time()
    for _ in range(500):
        image1 = cv2.imread(img_path)
    print('total time: %.3f s' % (time.time()-start))
    # total time: 3.533 s

    start = time.time()
    for _ in range(500):
        image2 = Image.open(img_path)
    print('total time: %.3f s' % (time.time()-start))
    # total time: 0.071 s

统一torch形式:

下面的方法对应的torch的img和img2形状、元素值均相同,可以等价替换;

img = transforms.ToTensor()(cv2.cvtColor(cv2.imread(img_path), cv2.COLOR_BGR2RGB))
img2 = transforms.ToTensor()(Image.open(img_path).convert('RGB'))

统一形式所占用的时间:

通过下面的比较发现:PIL虽然读取图片的速度快于cv2,但是在转化为torch的统一形式所话费的时间更长;

start = time.time()
for _ in range(500):
    img = transforms.ToTensor()(cv2.cvtColor(cv2.imread(img_path), cv2.COLOR_BGR2RGB))
print('total time: %.3f s' % (time.time()-start))
# total time: 7.396 s

start = time.time()
for _ in range(500):
    img2 = transforms.ToTensor()(Image.open(img_path).convert('RGB'))
print('total time: %.3f s' % (time.time()-start))
# total time: 8.767 s

通过看transforms.ToTensor()代码可以发现,PIL类型的数据所进行的转换操作要比np.array类型多,因此应该是在这部分占用了更多时间。(没有具体研究对PIL的哪一个操作占用时间)

你可能感兴趣的:(深度学习)