pillow opencv matplotlib读写图片有什么区别
from PIL import Image
import numpy as np
import cv2
from matplotlib import pyplot as plt
file_path = '1.png'
读彩色图像
区别:
- opencv-python读出来的是BGR颜色通道的
- PIL读出的是PIL类格式的,而cv和plt是numpy数组
# 读取彩色图像 都是H×W×C
img1 = cv2.imread(file_path) # BGR
img2 = plt.imread(file_path) # RGB
img3 = np.array(Image.open(file_path)) # RGB
BRG和RGB格式互转
# 用opencv-python
image_rgb = cv2.cvtColor(image_bgr, cv2.COLOR_BGR2RGB)
image_bgr = cv2.cvtColor(image_rgb, cv2.COLOR_RGB2BGR)
# 利用数组切片
# 因为shape是H×W×C,BGR倒着读就是RGB
image_rgb = image_bgr[:, :, ::-1]
读灰色图像
区别:
- plt没法读取时设置读灰色图像,但是可以在plt.imshow()的时候设置按照灰度图显示
# 以灰度图方式读取
img4 = cv2.imread(file_path, flags=cv.IMREAD_GRAYSCALE)
img6 = np.array(Image.open(file_path).convert("L"))
# img5 = plt.imread(file_path)
# plt没法以灰度方式读取,只能在imshow的时候以灰度方式显示plt.imshow(a, cmap='viridis', interpolation='nearest')
opencv的flags参数
常数 | 值 | 效果 |
---|---|---|
cv2.IMREAD_COLOR | 1 | 读取图像时保留颜色通道(默认值) |
cv2.IMREAD_GRAYSCALE | 0 | 以灰度模式读取图像 |
cv2.IMREAD_UNCHANGED | -1 | 以包含 alpha 通道的方式读取图像 |
保存图像
matplotlib:
plt保存原理是先创建画板,然后把图像绘制上去。
这会导致保存图像出现白边,以及像素大小与想要的大小不符的现象。不推荐使用!!
plt.imshow(image)
plt.savefig('output.png', bbox_inches='tight', transparent=True, dpi=300, figsize=(6, 4))
opencv:
简单好用
cv2.imwrite("output.jpg", img) # img是numpy数组
pillow:
必须先转PIL对象才能保存
# 使用PIL保存NumPy数组为图像
image = Image.fromarray(numpy_array)
# 保存图像
image.save("output.png")
显示图像
区别:
- PIL调用系统默认的图片查看工具
- opencv和matplotlib有自己的可视化工具,且matplotlib可以集成在Pycharm的SciView
# PIL
image = Image.open("image.jpg")
image.show()
# opencv
image = cv2.imread("image.jpg")
cv2.imshow("Image", image)
cv2.waitKey(0) # 修改等待时间可以用于展示视频帧
cv2.destroyAllWindows()
# matplotlib
plt.imshow(img)
plt.show()