【OpenCV】Python图像处理之读取与保存

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),可通过numpycv2.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)

五、常见问题与注意事项

  1. 路径问题

    • 绝对路径:cv2.imread('D:/images/test.jpg')(Windows)或cv2.imread('/home/user/images/test.jpg')(Linux/macOS)
    • 相对路径:确保脚本执行目录与图像文件目录正确,避免中文路径(可能导致读取失败)。
  2. 图像格式支持:OpenCV 支持 JPG、PNG、BMP、TIFF 等格式,不支持 WebP(需额外编译或转换)。

  3. 数据类型 :读取的图像数组类型为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)、路径处理和参数设置。结合错误判断和格式适配,可应对绝大多数图像读取与保存场景。

相关推荐
Ustinian_3101 小时前
【python】图片转PDF工具【附完整源码】
开发语言·python·pdf
谢景行^顾1 小时前
numpy
开发语言·python·numpy
上天夭2 小时前
PyTorch的Dataloader模块解析
人工智能·pytorch·python
是一个Bug2 小时前
Spring Boot 的全局异常处理器
spring boot·后端·python
dTTb2 小时前
python元组和字典
python
沐雪轻挽萤2 小时前
pytorch模型部署基础知识
人工智能·pytorch·python
xxxxxmy2 小时前
相向双指针—接雨水
python·相向双指针
nix.gnehc2 小时前
PyTorch数据加载与预处理
人工智能·pytorch·python
Sindy_he2 小时前
2025最新版微软GraphRAG 2.0.0本地部署教程:基于Ollama快速构建知识图谱
python·microsoft·大模型·知识图谱·rag