PIL和Opencv读取图片的区别
opencv读取图片
1 | import cv2 |
PIL读取图片
1 | from PIL import Image |
两者区别
从以上两个程序的输出结果可以看出如下不同:
opencv读取图片后的数据类型为numpy.ndarry,而PIL为PIL.JpegImagePlugin.JpegImageFile
opencv读取图片后,查看图片尺寸用img.shape,是一个三维数组,且第一维是图片的高(height),第二维是图片的宽(width)。而PIL读取图片后通过img.size查看尺寸,是一个二维数组,第一维是宽,第二维是高
既然二者读取图片后的数据类型不同,那是否可以相互转换呢?我们可以发现,opencv读取出来后的数据类型为numpy,且多维数组类型的数据转numpy都很方便,所以我们尝试将PIL读取出来的数据转为numpy,结果如下:
1 | img = np.array(img_pil, dtype=np.uint8) |
会发现,现在二者输出的图片尺寸是一样的了,那是不是转换成功了,我们来测试一下:
1 | print(img == img_cv2) |
全都是False,很明显是不对的。既然二者的数据大小都相同了,那为什么不相等呢,我print出了它们的数组,发现在第三维上二者数据的顺序恰好是相反的。
经过查询后得知,opencv读取的是图片的BGR格式,而PIL读取的是RGB格式,这也就解释了数据顺序相反的原因。
既然如此,我们将RGB转为BGR:
1 | img = img[:,:,::-1].copy() |