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快一点,不知道是不是真的

posted @   人都傻了  阅读(2090)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示