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

相关推荐
PixelMind1 天前
【超分辨率专题】SeedVR2 :基于对抗训练的单步扩散视频复原(SeedVR加速版)
图像处理·ai·视频复原·单步扩散
吴佳浩1 天前
Python入门指南(六) - 搭建你的第一个YOLO检测API
人工智能·后端·python
superman超哥1 天前
仓颉语言中基本数据类型的深度剖析与工程实践
c语言·开发语言·python·算法·仓颉
Learner__Q1 天前
每天五分钟:滑动窗口-LeetCode高频题解析_day3
python·算法·leetcode
————A1 天前
强化学习----->轨迹、回报、折扣因子和回合
人工智能·python
徐先生 @_@|||1 天前
(Wheel 格式) Python 的标准分发格式的生成规则规范
开发语言·python
Mqh1807621 天前
day45 简单CNN
python
却相迎1 天前
2004-Image thresholding using Tsallis entropy
图像处理·阈值分割
学习者0071 天前
python 下载离线库方法
python
声声codeGrandMaster1 天前
AI之模型提升
人工智能·pytorch·python·算法·ai