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。