目录
1. cv2
1.1 读取照片
- 默认:BGR
- image.shape:[h, w, c]
- 类型:numpy.ndarray
image_path = 'data/threepeople/images/train/cliproimore_1.jpg'
image = cv2.imread(image_path) # BGR
image_rgb = cv2.imread(image_path)[..., ::-1] # BGR to RGB
读取中文路径图像:
img = cv2.imdecode(np.fromfile(path, dtype=np.uint8), -1)
1.2 转换格式
参考博客:opencv-python的格式转换 RGB与BGR互转
opencv读取图片的默认像素排列是BGR,和很多其他软件不一致,需要转换。
- BGR to RGB ( OpenCV image to Matplotlib )
rgb = bgr[...,::-1]
- RGB to BGR ( Matplotlib image to OpenCV )
bgr = rgb[...,::-1] # ::-1表示逆序
- RGB to GBR ( 这个应该很少用到 )
gbr = rgb[...,[2,0,1]]
1.3 写入图像
cv2.imwrite('image.jpg', image)
保存中文图像名称:
cv2.imencode(".jpg", im0)[1].tofile(save_path)
1.4 显示图像
def cv_show(winname, img):
cv2.imshow(winname, img)
cv2.waitKey(0)
cv2.destroyAllWindows()
2. PIL

1. 读取、写入图像
- 默认:RGB
- image.size:[w, h]
- 类型:PIL.Image
from PIL import Image
image_path = 'data/threepeople/images/train/cliproimore_1.jpg'
image = Image.open(image_path) # RGB
写入图像
image.save(save_path)
2. 转换
2.2.1 转换模式(‘RGB’、‘L’)
用 convert
转换时,可选 mode
有3种:“L”, “RGB” and “CMYK” ,一般只用得到前两种,分别表示灰度图像、RGB三通道图像。
有时候可能读取的图像是4通道RGBA的(例如png),但是在训练过程中是需要3通道RGB的(例如jpg),因此需要转换一下:
image = Image.open(image_path) # RGBA
image = image.convert('RGB') # RGB
2.2.2 转换数据类型 numpy ←→ PIL
- PIL → numpy
from PIL import Image
import numpy as np
image = Image.open(image_path) # PIL.JpegImagePlugin.JpegImageFile
image = np.array(image) # numpy.ndarray
- numpy → PIL
from PIL import Image
import cv2
image = cv2.imread(image_path) # BGR
image = image[..., ::-1] # BGR -> RGB
image = Image.fromarray(image) # numpy -> PIL
image.show()
image.save('image_PIL.jpg')
3. 消除PIL图像中的exif
因为相机的Exif信息所以在PyCharm中打开的图像自动旋转了
使用 ImageOps
包
from PIL import Image, ImageOps
img = Image.open(img_path)
img = ImageOps.exif_transpose(img)