OpenCV-Python 中图像的读取与保存是图像处理的基础操作,涉及不同格式图像的加载、格式转换、保存参数设置等。以下详细介绍核心方法及常见场景的实现:
一、图像读取(cv2.imread())
cv2.imread()用于从文件读取图像,返回 NumPy 数组(numpy.ndarray),默认以 BGR 格式存储(注意与 PIL 的 RGB 格式区别)。
1. 基本用法
python
import cv2
# 读取图像(默认彩色模式)
img = cv2.imread('image.jpg')
# 读取灰度图像(参数cv2.IMREAD_GRAYSCALE)
gray_img = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)
# 读取包含alpha通道的图像(参数cv2.IMREAD_UNCHANGED)
rgba_img = cv2.imread('image.png', cv2.IMREAD_UNCHANGED)
2. 参数说明
| 参数值 | 作用 |
|---|---|
cv2.IMREAD_COLOR(1) |
默认值,读取彩色图像,忽略 alpha 通道 |
cv2.IMREAD_GRAYSCALE(0) |
读取灰度图像 |
cv2.IMREAD_UNCHANGED(-1) |
读取原始图像(包含 alpha 通道,如 PNG、TIFF) |
3. 错误处理(图像读取失败)
若文件路径错误、文件损坏或格式不支持,cv2.imread()返回None,需添加判断:
python
img = cv2.imread('invalid_path.jpg')
if img is None:
print("图像读取失败,请检查路径或文件格式!")
else:
print(f"图像形状: {img.shape}") # 输出(高度, 宽度, 通道数)
二、图像显示(辅助验证读取结果)
读取图像后,可通过cv2.imshow()临时显示,结合cv2.waitKey()和cv2.destroyAllWindows()使用:
python
cv2.imshow('Color Image', img)
cv2.imshow('Gray Image', gray_img)
cv2.waitKey(0) # 按任意键关闭窗口(参数为0表示无限等待)
cv2.destroyAllWindows() # 释放窗口资源
三、图像保存(cv2.imwrite())
cv2.imwrite()将图像保存为指定格式的文件,支持 JPG、PNG、BMP 等常见格式。
1. 基本用法
python
# 保存彩色图像
cv2.imwrite('saved_image.jpg', img)
# 保存灰度图像
cv2.imwrite('saved_gray.png', gray_img)
# 保存带alpha通道的图像(需用PNG格式)
cv2.imwrite('saved_rgba.png', rgba_img)
2. 保存参数设置
针对不同格式,可通过第三个参数设置压缩质量、透明度等:
- JPG 格式:调整压缩质量(0-100,默认 95,值越高质量越好)
- PNG 格式:调整压缩级别(0-9,默认 3,值越高压缩率越高)
python
# JPG保存:设置质量为80
cv2.imwrite('high_quality.jpg', img, [cv2.IMWRITE_JPEG_QUALITY, 80])
# PNG保存:设置压缩级别为6
cv2.imwrite('compressed.png', img, [cv2.IMWRITE_PNG_COMPRESSION, 6])
3. 常见保存参数
| 参数常量 | 适用格式 | 作用及取值范围 |
|---|---|---|
cv2.IMWRITE_JPEG_QUALITY |
JPG | 压缩质量(0-100,默认 95) |
cv2.IMWRITE_PNG_COMPRESSION |
PNG | 压缩级别(0-9,默认 3) |
cv2.IMWRITE_PXM_BINARY |
PPM/PGM/PBM | 二进制格式(1)或 ASCII 格式(0) |
四、特殊场景处理
1. 从内存 / 网络读取图像
若图像不是本地文件(如 Base64 编码、网络 URL),可通过numpy和cv2.imdecode()读取:
python
import numpy as np
import requests
# 从URL读取图像
url = "https://example.com/image.jpg"
response = requests.get(url)
img_array = np.asarray(bytearray(response.content), dtype=np.uint8)
img = cv2.imdecode(img_array, cv2.IMREAD_COLOR)
2. 保存透明图像(Alpha 通道)
需确保图像包含 alpha 通道(如 PNG),保存时使用cv2.IMREAD_UNCHANGED读取并直接保存:
python
# 读取带alpha通道的PNG
rgba_img = cv2.imread('transparent.png', cv2.IMREAD_UNCHANGED)
# 保存透明图像(必须用PNG格式)
cv2.imwrite('saved_transparent.png', rgba_img)
3. 格式转换后保存
若需将 BGR 格式(OpenCV 默认)转为 RGB 格式保存(如匹配 PIL),可通过cv2.cvtColor()转换:
python
img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
cv2.imwrite('rgb_image.jpg', img_rgb)
五、常见问题与注意事项
-
路径问题:
- 绝对路径:
cv2.imread('D:/images/test.jpg')(Windows)或cv2.imread('/home/user/images/test.jpg')(Linux/macOS) - 相对路径:确保脚本执行目录与图像文件目录正确,避免中文路径(可能导致读取失败)。
- 绝对路径:
-
图像格式支持:OpenCV 支持 JPG、PNG、BMP、TIFF 等格式,不支持 WebP(需额外编译或转换)。
-
数据类型 :读取的图像数组类型为
uint8(0-255),若进行浮点运算后保存,需转回uint8:python# 示例:浮点图像转回uint8并保存 float_img = img.astype(np.float32) / 255.0 save_img = (float_img * 255).astype(np.uint8) cv2.imwrite('restored.jpg', save_img)
六、完整示例
python
import cv2
import numpy as np
# 1. 读取图像
img = cv2.imread('test.jpg', cv2.IMREAD_COLOR)
if img is None:
raise ValueError("图像读取失败!")
# 2. 显示图像信息
print(f"图像形状: {img.shape}") # (height, width, channels)
print(f"数据类型: {img.dtype}") # uint8
# 3. 转换为灰度图
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 4. 保存图像
cv2.imwrite('gray_test.jpg', gray) # 保存灰度图
cv2.imwrite('compressed_test.jpg', img, [cv2.IMWRITE_JPEG_QUALITY, 70]) # 低质量JPG
# 5. 显示结果
cv2.imshow('Original', img)
cv2.imshow('Gray', gray)
cv2.waitKey(0)
cv2.destroyAllWindows()
总结
OpenCV 的imread()和imwrite()是图像 IO 的核心函数,需注意格式转换(BGR↔RGB)、路径处理和参数设置。结合错误判断和格式适配,可应对绝大多数图像读取与保存场景。