杰瑞科技汇

Python OpenCV如何读取图像?

安装 OpenCV

如果你还没有安装 OpenCV,请先打开终端或命令提示符,使用 pip 进行安装:

Python OpenCV如何读取图像?-图1
(图片来源网络,侵删)
pip install opencv-python

为了在读取图像时看到图像,我们还需要安装 Matplotlib 库来显示图像:

pip install matplotlib

基础图像读取 (cv2.imread)

OpenCV 提供了 cv2.imread() 函数来读取图像,它的基本语法是:

cv2.imread(filename, flags)
  • filename: 图像文件的路径,可以是相对路径或绝对路径。
  • flags: 读取图像的标志,它决定了图像如何被读取,这是一个可选参数,默认值为 cv2.IMREAD_COLOR

flags 参数详解

OpenCV 提供了三种最常用的标志:

标志值 (常量) 整数值 描述
cv2.IMREAD_COLOR 1 默认值,加载彩色图像,忽略任何透明度通道(Alpha 通道),图像会被读取为 BGR 格式的三维数组。
cv2.IMREAD_GRAYSCALE 0 灰度模式,将图像作为灰度图像加载,忽略所有颜色信息,图像会被读取为二维数组(单通道)。
cv2.IMREAD_UNCHANGED -1 不改变模式,按原样加载图像,包括 Alpha 通道(透明度),如果图像有 Alpha 通道,则会被读取为 BGRA 格式的四维数组。

代码示例

下面我们通过一个完整的例子来演示如何读取、查看和保存图像。

Python OpenCV如何读取图像?-图2
(图片来源网络,侵删)

假设你有一张名为 lena.jpg 的图片,和你的 Python 脚本放在同一个文件夹下。

示例 1:读取彩色图像

import cv2
import matplotlib.pyplot as plt
# 1. 读取图像 (默认彩色模式)
# OpenCV 会将图像读取为 NumPy 数组
image_bgr = cv2.imread('lena.jpg')
# 检查图像是否成功读取
# 如果路径错误或文件不存在,cv2.imread() 会返回 None
if image_bgr is None:
    print("错误:无法加载图像,请检查路径是否正确。")
else:
    print("图像成功加载!")
    print("图像的形状 (高度, 宽度, 通道数):", image_bgr.shape)
    print("图像的数据类型:", image_bgr.dtype)
    # 2. 显示图像
    # OpenCV 的 cv2.imshow() 会创建一个新窗口来显示图像
    # 但在 Jupyter Notebook 或脚本中,matplotlib 通常更方便
    # 注意:OpenCV 默认使用 BGR 格式,而 Matplotlib 使用 RGB 格式
    # 所以我们需要转换颜色空间才能正确显示
    # 将 BGR 转换为 RGB
    image_rgb = cv2.cvtColor(image_bgr, cv2.COLOR_BGR2RGB)
    # 使用 Matplotlib 显示
    plt.imshow(image_rgb)
    plt.title('Original Image (RGB)')
    plt.axis('off') # 关闭坐标轴
    plt.show()

示例 2:读取灰度图像

import cv2
import matplotlib.pyplot as plt
# 读取为灰度图像
image_gray = cv2.imread('lena.jpg', cv2.IMREAD_GRAYSCALE)
if image_gray is None:
    print("错误:无法加载图像,请检查路径是否正确。")
else:
    print("灰度图像成功加载!")
    print("灰度图像的形状 (高度, 宽度):", image_gray.shape)
    print("灰度图像的数据类型:", image_gray.dtype)
    # 显示灰度图像
    # 对于灰度图像,cmap='gray' 参数很重要,它告诉 Matplotlib 使用灰度颜色映射
    plt.imshow(image_gray, cmap='gray')
    plt.title('Grayscale Image')
    plt.axis('off')
    plt.show()

示例 3:读取带 Alpha 通道的图像

假设你有一张 PNG 图片 logo.png,它有透明背景。

import cv2
import matplotlib.pyplot as plt
# 读取为包含 Alpha 通道的图像
image_bgra = cv2.imread('logo.png', cv2.IMREAD_UNCHANGED)
if image_bgra is None:
    print("错误:无法加载图像,请检查路径是否正确。")
else:
    print("BGRA 图像成功加载!")
    print("BGRA 图像的形状 (高度, 宽度, 通道数):", image_bgra.shape)
    # 如果图像有4个通道,说明它有Alpha通道
    if image_bgra.shape[2] == 4:
        # 分别显示 B, G, R, A 通道
        b, g, r, a = cv2.split(image_bgra)
        plt.figure(figsize=(10, 5))
        plt.subplot(141)
        plt.imshow(b, cmap='Blues')
        plt.title('Blue Channel')
        plt.subplot(142)
        plt.imshow(g, cmap='Greens')
        plt.title('Green Channel')
        plt.subplot(143)
        plt.imshow(r, cmap='Reds')
        plt.title('Red Channel')
        plt.subplot(144)
        plt.imshow(a, cmap='gray')
        plt.title('Alpha Channel (Transparency)')
        plt.tight_layout()
        plt.show()

常见问题与注意事项

路径问题

这是最常见的错误。cv2.imread() 找不到文件时,不会抛出异常,而是返回 None

错误示例:

Python OpenCV如何读取图像?-图3
(图片来源网络,侵删)
image = cv2.imread('path/that/does/not/exist.jpg')
print(image) # 输出: None
# 如果你直接对 None 进行操作,程序会崩溃
# print(image.shape) -> AttributeError: 'NoneType' object has no attribute 'shape'

正确做法: 在读取后始终检查返回值是否为 None

image = cv2.imread('lena.jpg')
if image is None:
    print("加载失败,请检查路径!")
    # 可以在这里添加错误处理逻辑,比如退出程序
    exit()

颜色空间问题 (BGR vs. RGB)

这是 OpenCV 新手最容易混淆的地方。

  • OpenCV 内部使用 BGR (蓝-绿-红) 顺序来存储和显示彩色图像。
  • Matplotlib, PIL (Pillow), 以及大多数其他图像库使用 RGB (红-绿-蓝) 顺序。

当你用 OpenCV 读取图像后想用 Matplotlib 显示时,必须进行颜色空间转换

# 错误的显示方式 (颜色会错乱)
# image_bgr = cv2.imread('lena.jpg')
# plt.imshow(image_bgr) # 颜色会非常奇怪
# 正确的显示方式
image_bgr = cv2.imread('lena.jpg')
image_rgb = cv2.cvtColor(image_bgr, cv2.COLOR_BGR2RGB)
plt.imshow(image_rgb)
plt.show()

图像路径中的中文问题

在某些操作系统(如 Windows)上,如果图像路径中包含中文字符,cv2.imread() 可能会失败。

解决方案: 在路径前加上 r (表示原始字符串),并确保使用正确的编码。

# 使用原始字符串
image_path = r'C:\Users\用户名\Desktop\中文图片.jpg'
image = cv2.imread(image_path)
if image is None:
    print("可能是因为路径中的中文导致读取失败。")

图像文件格式支持

OpenCV (cv2.imread) 支持多种格式,包括:

  • JPEG/JPG
  • PNG
  • BMP
  • TIFF
  • WebP
  • 等等

但对于一些较新的或较少见的格式,可能需要依赖系统安装的编解码器(如 libjpeg, libpng 等),如果遇到问题,可以尝试使用 Pillow 库,它对格式的支持通常更广泛。


任务 代码/方法 说明
读取彩色图像 img = cv2.imread('image.jpg') 默认方式,读取为 BGR 格式。
读取灰度图像 img = cv2.imread('image.jpg', 0) 0cv2.IMREAD_GRAYSCALE 的简写。
读取带 Alpha 通道 img = cv2.imread('image.png', -1) -1cv2.IMREAD_UNCHANGED 的简写。
检查是否读取成功 if img is None: 必须做! 防止因文件不存在而崩溃。
显示图像 (Matplotlib) img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
plt.imshow(img_rgb)
关键步骤:BGR 转 RGB。
保存图像 cv2.imwrite('output.jpg', img) OpenCV 默认按 BGR 格式保存。

掌握这些基础操作是使用 OpenCV 进行更复杂图像处理(如滤波、边缘检测、特征提取等)的第一步。

分享:
扫描分享到社交APP
上一篇
下一篇