OpenCV 和 PIL(现在是 Pillow 库)是 Python 中最常用的两个图像处理库,但它们在读取图片时有显著的区别。
- OpenCV: 设计用于计算机视觉,强调矩阵运算和速度,读取的图像直接是 NumPy 数组,易于进行各种矩阵变换。
- PIL/Pillow: 设计用于图像处理(如编辑、归档、展示),提供了丰富的图像操作功能,读取的是自定义的 Image 对象,需要转换才能进行复杂的矩阵运算。
两者区别
- 区别1:读取之后的对象类型不同:NumPy数组 vs PIL对象
- OpenCV: 读取后直接是一个 (H, W, C) 形状的 NumPy 数组。使用opencv读取图片的示例:
# python代码
import cv2
img_cv = cv2.imread(‘image.jpg’)
print(type(img_cv)) # <class ‘numpy.ndarray’>
print(img_cv.shape) # (高度, 宽度, 通道数) 例如 (480, 640, 3)
- PIL: 读取后是一个 PIL.Image.Image 对象。使用PIL读取图片的示例:
# python代码
from PIL import Image
img_pil = Image.open(‘image.jpg’)
print(type(img_pil)) # <class ‘PIL.JpegImagePlugin.JpegImageFile’>
print(img_pil.size) # (宽度, 高度) 例如 (640, 480)
print(img_pil.mode) # ‘RGB’
- 颜色通道顺序:BGR vs RGB
- OpenCV 在底层使用 BGR 格式。这是其历史原因决定的。
- PIL 使用常见的 RGB 格式。
当图像保存的时候,也会有通道顺序的差异:
- PIL.Image.save()直接保存RGB的图片
- cv2.imwirte()保存的为BGR通道顺序的图片
- 元数据
- PIL 会保留图像的 EXIF 信息(如相机型号、拍摄时间、GPS等)。
- OpenCV 在 imread 时会丢弃所有这些元数据,只保留像素数据。
两者联系(Numpy array和PIL Image的互相转换)
- PIL Image → OpenCV (NumPy array)
from PIL import Image
import cv2
import numpy as np
# PIL 读取
img_pil = Image.open(‘image.jpg’)
# 转换为 NumPy 数组 (此时是 RGB)
img_array = np.array(img_pil)
# 将 RGB 转换为 OpenCV 需要的 BGR
img_cv_from_pil = cv2.cvtColor(img_array, cv2.COLOR_RGB2BGR)
# 现在可以用 OpenCV 处理了
- OpenCV (NumPy array) → PIL Image
import cv2
from PIL import Image
import numpy as np
# OpenCV 读取 (BGR)
img_cv = cv2.imread(‘image.jpg’)
# 将 BGR 转换为 RGB
img_rgb = cv2.cvtColor(img_cv, cv2.COLOR_BGR2RGB)
# 转换为 PIL Image
img_pil_from_cv = Image.fromarray(img_rgb)
# 现在可以用 PIL 处理了

2061

被折叠的 条评论
为什么被折叠?



