CV2和PIL读取图像方法与区别对比


1.读取的通道不同:cv2读取图像为BGR顺序通道,PIL读取图像为RGB顺序通道.

2.读取图像代码对比:

# cv2读取方式
input1 = r'E:\DRPL\data\blur\1_ILSVRC2012_val_00004507_3_183.jpg'
cv2img = cv2.imread(input1, flags=cv2.IMREAD_COLOR)  # 默认以BGR形式打开
cv2.imshow("cv2img", cv2img) cv2.waitKey(0) 
# PIL读取方式
input2 = r'E:\DRPL\data\blur\1_ILSVRC2012_val_00004507_3_re183.jpg'
pilimg = Image.open(input2) pilimg.show()

3.读取出的图像类型以及尺度属性对比:

print(cv2img.shape, cv2img.size, type(cv2img)) print(pilimg.size, type(pilimg))

cv2读取出图像的类型为ndarray类型,pil读取的为PIL类型。
cv2读取的图像同时拥有shape()和size()方法,pil只有size()方法。

4.将cv2和PIL转换为tensor数据类型代码对比:

trans = transforms.ToTensor() tensor_cv2 = trans(cv2img) tensor_pil = trans(pilimg) print(tensor_cv2.shape, tensor_cv2.size(), type(tensor_cv2)) print(tensor_pil.shape, tensor_pil.size(), type(tensor_pil))

 

 两者都可以转换为tensor数据类型

5.cv2图像和PIL图像相互转换:

# 将PIL转换为cv2
# 方法1:用numpy.asarray()函数转化类型,再用cv2.cvtColor转化RGB为BGR通道. trans_cv2img = cv2.cvtColor(numpy.asarray(pilimg), cv2.COLOR_RGB2BGR) cv2.imshow("trans_cv2img", trans_cv2img) cv2.waitKey(0)
# 方法2:可以不使用cv2.cvtColor,但是show出来的图像会发蓝,因为没有变换通道 trans_tocv2
= numpy.array(pilimg) cv2.imshow("transtocv2", transtocv2) cv2.waitKey(0)

6.其他知识引申:

# 转换RGB的方法对比
cv2img1 = cv2.cvtColor(cv2img, cv2.COLOR_BGR2RGB) pilimg1 = pilimg.convert('RGB')
将PILimg转换为cv2时可以使用numpy.array(),也可以使用numpy.asarray(),这两者的区别在于array会copy出一个副本,占用新的内存,但asarray不会.
就是说将数据源用asarray转换后赋值给新的变量,再对原始数据源进行操作修改,会影响到新的变量数据.
而如果用array来转换并赋值给新变量,修改原始数据后不会对新变量造成影响.

 

他们说PIL读取图片速度比cv2快一点,不知道是不是真的


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM