CV代码小技巧记录(更新ing)

这篇博客介绍了如何使用OpenCV和PIL库进行图像处理,包括读取、转换格式、写入图像以及显示。OpenCV默认读取图像为BGR格式,可以使用`cv2.imread`并反转通道实现BGR到RGB的转换。PIL库默认读取为RGB,可以使用`Image.open`和`convert`方法转换模式。此外,还提到了如何在PIL图像中消除Exif信息以避免图像自动旋转问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

孟孟单单

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值