contribute上次修改:2026-09-29

1.3 读取、显示与保存图像

总目录:1.1 OpenCV介绍与学习路线 | 第一章:认识图像与跑通流程 | 编号:1.3

← 上一节:1.2 图像、像素与坐标 | 下一节:1.4 视频与摄像头 →


1.3 读取、显示与保存图像

这篇只做一件事:把“一张图进来,一张图出去”的最短路径跑通。后面无论检测什么,都建立在这四个函数上。

一、imread:把文件读成图像数组

image = cv2.imread("resources/lena.png")

常见读取模式:

模式 作用
cv2.IMREAD_COLOR 默认模式,读取三通道 BGR 图像
cv2.IMREAD_GRAYSCALE 直接读取为单通道灰度图
cv2.IMREAD_UNCHANGED 尽量保留原始通道,例如 PNG 的透明通道
gray = cv2.imread("resources/lena.png", cv2.IMREAD_GRAYSCALE)

路径错误时,imread 通常不会替你弹出大红报错,而是返回 None。所以每次都检查:

if image is None:
    raise FileNotFoundError("读取失败,请检查路径和文件名")

二、imshow:把数组显示成窗口

cv2.imshow("Original", image)
  • 第一个参数是窗口名,可以自定义;
  • 第二个参数是要显示的图像数组;
  • 同名窗口再次显示时会更新内容。

图像太大时,可以创建可缩放窗口:

cv2.namedWindow("Preview", cv2.WINDOW_NORMAL)
cv2.resizeWindow("Preview", 960, 540)
cv2.imshow("Preview", image)

这里只改变窗口显示大小,不会修改 image 本身的分辨率。真的缩放图像要用 resize。

三、waitKey:等待按键并维持窗口响应

key = cv2.waitKey(0)
  • 0:一直等到有按键;
  • 正整数:最多等待对应毫秒数,常用于视频循环;
  • 它不只是“延时”,还让 HighGUI 窗口处理刷新和键盘事件。

检测 q:

if cv2.waitKey(1) & 0xFF == ord("q"):
    break

静态图里一般使用 waitKey(0);视频里常用 waitKey(1)。函数名里的 K 是大写,原笔记中的 waitkey 会报错。

四、imwrite:把结果保存回文件

ok = cv2.imwrite("output/result.png", image)
if not ok:
    raise OSError("图像保存失败")

文件后缀决定编码格式,例如 .png、.jpg。保存前要保证父目录已经存在:

from pathlib import Path

output_path = Path("output/result.png")
output_path.parent.mkdir(parents=True, exist_ok=True)
cv2.imwrite(str(output_path), image)

五、一个完整的最小程序

from pathlib import Path
import cv2

input_path = Path("resources/lena.png")
output_path = Path("output/lena_gray.png")

image = cv2.imread(str(input_path))
if image is None:
    raise FileNotFoundError(f"读取失败:{input_path.resolve()}")

gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

cv2.imshow("Original", image)
cv2.imshow("Gray", gray)
cv2.waitKey(0)
cv2.destroyAllWindows()

output_path.parent.mkdir(parents=True, exist_ok=True)
if not cv2.imwrite(str(output_path), gray):
    raise OSError(f"保存失败:{output_path}")

常见故障

现象 先检查什么
image is None 路径、工作目录、中文或特殊字符兼容性
窗口一闪而过 是否忘记 waitKey(0)
窗口无响应 是否没有调用 waitKey
服务器上无法弹窗 是否处于无桌面环境;改用 imwrite 保存
颜色看着怪 是否把 OpenCV 的 BGR 当成 RGB

← 上一节:1.2 图像、像素与坐标 | 下一节:1.4 视频与摄像头 →

留言区

不收集任何个人信息;昵称只绑定浏览器里的随机 Cookie。