PIL,cv2,plt的使用与区别

1 比较三者的打开图片、显示图片、打开的图片的类型

from PIL import Image
import cv2
import matplotlib.pyplot as plt

import numpy as np

# 比较三者的打开图片、显示图片、打开图片的类型
# ************PIL************
PIL_img = Image.open('D:/images/Rimi.jpg')
print(type(PIL_img))  # <class 'PIL.JpegImagePlugin.JpegImageFile'>
print(PIL_img.size)   # (1152, 720) (w,h)
print(np.array(PIL_img).shape)  # (720, 1152, 3) (h,w,c)
PIL_img.show()
# ************cv2************
cv2_img = cv2.imread('D:/images/Rimi.jpg')
print(type(cv2_img))  # <class 'numpy.ndarray'>
print(cv2_img.shape)  # (720, 1152, 3) (h,w,c)
cv2.imshow('cv2', cv2_img)
# cv2.waitKey()
# ************plt***********
plt_img = plt.imread('D:/images/Rimi.jpg')
print(type(plt_img))  # <class 'numpy.ndarray'>
print(plt_img.shape)  # (720, 1152, 3) (h,w,c)
plt.imshow(plt_img)  # PIL_img也可以显示
plt.show()

可以看到cv2与plt打开的图片类型都是numpy,而PIL是自己独自的类型。当然这三者可以互相转换。(注意:plt可以显示numpy类型的图像,也可以显示PIL类型的

PIL打开图像的shape为(w,h),而cv2与plt打开rgb图像都是(h,w,c)。将PIL格式图像转为numpy后,其格式也变为(h,w,c)

执行结果

2 图像类型的转换(PIL与numpy)

# PIL转numpy
img_trans = np.array(PIL_img)
print(type(img_trans))  # <class 'numpy.ndarray'>
# numpy转PIL
img_trans = Image.fromarray(cv2_img)
print(type(img_trans))  # <class 'PIL.Image.Image'>```

3 PIL,cv2,plt混用

3.1 cv2、plt读PIL打开的图像

PIL_img = Image.open('D:/images/Rimi.jpg')
cv2.imshow('cv2', np.array(PIL_img))   # cv2显示
plt.imshow(np.array(PIL_img))  # plt显示
plt.show()

cv2、plt读PIL打开的图像
首先将图像转为numpy,可以看到plt正常读出来了。但是cv2显示出来图像失真了。这是由于cv2读取图像是以BGR的顺序读的,而plt与PIL都是以RGB读的,所以plt可以正常的显示出图片

所以只需要将读取的图像从RGB转为BGR就行了,如下:

PIL_img = Image.open('D:/images/Rimi.jpg')
cv2.imshow('cv2', np.array(PIL_img)[..., ::-1])  # ::-1代表逆序输出
cv2.waitKey()

在这里插入图片描述

3.2 PIL、plt读cv2打开的图片

cv2_img = cv2.imread('D:/images/Rimi.jpg')
Image.fromarray(cv2_img).show()   # PIL显示
plt.imshow(cv2_img)     # plt显示
plt.show()

执行结果如下,前面说了PIL与plt显示图像的格式都是RGB,而cv2打开是BGR,所以结果当然会失真

解决办法同样是加上[…, ::-1]
在这里插入图片描述

3.3 PIL,cv2读plt打开的图像

众所周知,有一说一,结果必然是cv2显示失真,PIL显示正常

plt_img = plt.imread('D:/images/Rimi.jpg')
Image.fromarray(plt_img).show()  # PIL显示
cv2.imshow('cv2', plt_img)     # cv2显示
cv2.waitKey()

在这里插入图片描述

  • 7
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值