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

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 格式的四维数组。 |
代码示例
下面我们通过一个完整的例子来演示如何读取、查看和保存图像。

假设你有一张名为 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。
错误示例:

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) |
0 是 cv2.IMREAD_GRAYSCALE 的简写。 |
| 读取带 Alpha 通道 | img = cv2.imread('image.png', -1) |
-1 是 cv2.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 进行更复杂图像处理(如滤波、边缘检测、特征提取等)的第一步。
