计算机视觉基础|第2章 OpenCV图像基础操作(读写、窗口、像素操作)

目录

  • [2.1 本章学习目标](#2.1 本章学习目标)
  • [2.2 图像读取 imread](#2.2 图像读取 imread)
    • [2.2.1 基本语法](#2.2.1 基本语法)
    • [2.2.2 标准读取代码(带判错)](#2.2.2 标准读取代码(带判错))
    • [2.2.3 opencv坑点](#2.2.3 opencv坑点)
  • [2.3 图像显示 imshow 与窗口控制](#2.3 图像显示 imshow 与窗口控制)
    • [2.3.1 完整显示代码](#2.3.1 完整显示代码)
    • [2.3.2 waitKey() 函数参数详解与实战用法](#2.3.2 waitKey() 函数参数详解与实战用法)
    • [2.3.3 可自由缩放窗口](#2.3.3 可自由缩放窗口)
  • [2.4 图像保存 imwrite](#2.4 图像保存 imwrite)
  • [2.5 图像 shape 与像素原理](#2.5 图像 shape 与像素原理)
  • [2.6 像素读取与像素修改](#2.6 像素读取与像素修改)
    • [2.6.1 读取单个像素](#2.6.1 读取单个像素)
    • [2.6.2 修改像素颜色](#2.6.2 修改像素颜色)
  • [2.7 本章总结](#2.7 本章总结)

2.1 本章学习目标

上一章我们了解了计算机视觉的基本概念、图像的数字化原理,并成功搭建 OpenCV 开发环境。本章开始正式进入实战,掌握 OpenCV 最核心、最基础的图像操作。

学完本章你将掌握:

  • 图片读取、显示、保存的标准代码写法
  • 解决新手高频报错:路径问题、图片读空问题
  • 理解图像 shape 结构:高度、宽度、通道数
  • 手动读取、修改图像像素,真正理解"图像是数字矩阵"

2.2 图像读取 imread

在 OpenCV 中,我们通过 cv2.imread() 函数完成图像读取操作,这是所有计算机视觉实战任务的起始步骤。图像在计算机中并非可视画面,而是以多维数字数组的形式存储,彩色图像本质为三维数组,后续所有图像处理操作,都是对该数组数据的运算与修改。

2.2.1 基本语法

python 复制代码
cv2.imread(filename, flags)

filename:文件路径,尽量避免带有中文的路径,opencv对于中文路径可能无法读取

flags:读取模式

flags常用读取模式:

  • cv2.IMREAD_COLOR:默认,读取彩色图,忽略透明度
  • cv2.IMREAD_GRAYSCALE:以灰度模式读取
  • cv2.IMREAD_UNCHANGED:完整读取,包含透明通道
  • flags = 0 也是以灰度模式读取

2.2.2 标准读取代码(带判错)

新手最常见问题:图片路径错误导致读取为空,程序不报错但无法显示。所以加判空判断。不是非必须,容易检查代码错误。

python 复制代码
import cv2
# 读取图片,r 防止转义字符报错
#以彩色模式读取
img = cv2.imread(r"D:\pythoncode2\bigdata_ai40\Image\qie.png", cv2.IMREAD_COLOR)
#判空:防止路径错误、图片不存在
if img is None:
print("图片读取失败,请检查路径是否正确!")
else:
print("图片读取成功")
print("图像形状:", img.shape)

2.2.3 opencv坑点

  • 路径不要中文、不要空格,极易读空
  • Windows 路径加 r,避免 \ 被当成转义字符
  • OpenCV 读取彩色图是三维数组,默认是 BGR 通道,不是 RGB!

2.3 图像显示 imshow 与窗口控制

读取图片后,使用 cv2.imshow() 展示图像,配合 waitKey 和 destroyAllWindows 完成窗口控制,可以显示多个窗口。

函数语法:cv2.imshow(winname, mat)

winname(窗口名称):字符串类型,用于自定义显示窗口的唯一标识,建议使用英文、数字命名,禁止使用中文、特殊符号和空格。

mat(图像矩阵):数组类型 ,传入通过 cv2.imread() 读取成功的图像数组对象,是需要可视化展示的目标图像。

重点避坑:窗口名称严禁使用中文。OpenCV底层对中文窗口名兼容性极差,使用中文会出现窗口乱码、显示异常,甚至程序闪退、运行报错等问题,统一使用英文、数字命名窗口即可。

2.3.1 完整显示代码

python 复制代码
import cv2
img = cv2.imread(r"D:\pythoncode2\bigdata_ai40\Image\qie.png")
if img is not None:
#创建窗口并显示图片
cv2.imshow("picture", img)
waitKey(0):无限等待,按任意键关闭窗口
cv2.waitKey(0)
#关闭所有窗口,释放内存
cv2.destroyAllWindows()

2.3.2 waitKey() 函数参数详解与实战用法

cv2.waitKey() 是 OpenCV 专属键盘监听函数,用于控制图像窗口的停留时间,是图像显示必不可少的配套函数,无该函数窗口会瞬间闪退。函数返回值为按键对应的ASCII码数值,可实现自定义按键交互逻辑。

  • waitKey(0)|无限等待模式(调试首选)
    程序持续阻塞、窗口一直停留,按下任意键盘按键即可关闭窗口,适配日常代码调试、效果查看场景。
  • waitKey(delay)|定时关闭模式
    传入正整数代表毫秒数,如 waitKey(2000) 表示窗口停留2秒,无按键操作则自动关闭窗口。
  • 自定义按键关闭窗口(进阶实战)
    利用函数返回的ASCII码,可指定专属按键关闭窗口,精准控制程序逻辑,避免任意按键误触发关闭。

waitKey(60) =ASCII码

  • 窗口生效规则
    该函数仅对当前激活的最新窗口生效,默认监听并关闭最后展示的图像窗口,多窗口场景下需注意监听顺序。

2.3.3 可自由缩放窗口

默认窗口大小固定,如需拖拽缩放,可创建可调节窗口:

python 复制代码
cv2.namedWindow("picture", cv2.WINDOW_NORMAL)
cv2.imshow("picture", img)

2.4 图像保存 imwrite

使用 cv2.imwrite() 可以将处理后的图片保存到本地,支持 jpg、png 格式互转。

python 复制代码
import cv2
img = cv2.imread(r"D:\pythoncode2\bigdata_ai40\Image\qie.png")
if img is not None:
#保存图片
res = cv2.imwrite(r"D:\pythoncode2\save.png", img)
if res:
print("图片保存成功!")

2.5 图像 shape 与像素原理

第一章我们知道:图片就是数字矩阵,矩阵的话,可以理解为,嵌套列表,现在通过代码直观理解。

打印 img.shape 会得到三元组:(高度, 宽度, 通道数)

  • 高度 height:图片有多少行像素
  • 宽度 width:图片有多少列像素
  • 通道 channel:彩色图3通道,灰度图1通道

超级重点:先高后宽,和我们平时"宽×高"相反,90%新手会搞错!

2.6 像素读取与像素修改

图像本质是数组,我们可以直接通过坐标修改像素颜色。

2.6.1 读取单个像素

python 复制代码
import cv2
img = cv2.imread(r"D:\pythoncode2\bigdata_ai40\Image\企鹅.png")
#获取坐标 (100,100) 的像素值
pixel = img[100, 100]
print("像素值(BGR):", pixel)

2.6.2 修改像素颜色

我们将图片某一坐标像素改为白色 (255,255,255):

用切片更改某一区域像素值

python 复制代码
import cv2
img = cv2.imread(r"D:\pythoncode2\bigdata_ai40\Image\企鹅.png")
#修改单个像素为白色
img[100, 100] = [255, 255, 255]
#修改一片区域为黑色
#切片,某一区域
img[200:300, 200:300] = [0, 0, 0]
cv2.imshow("change", img)
cv2.waitKey(0)
cv2.destroyAllWindows()

通过像素修改,我们可以直观验证:改变矩阵数值 = 改变图像画面

2.7 本章总结

本章彻底打通了计算机视觉最底层的图像操作逻辑,是后续所有图像处理、特征检测、目标识别的基础。

核心知识点回顾:

  • 掌握 imread、imshow、imwrite 三大基础操作
  • 学会判空、路径避坑、窗口控制
  • 理解 shape 顺序:(高度, 宽度, 通道)
  • 能够手动读取、修改像素,真正理解图像数字化原理
相关推荐
avi91111 小时前
[AI教做人]AI平台做2项目;一个3D模型展示,另一个框架多人
javascript·人工智能·ai·3d模型·3d引擎·顶点和法线
焱童鞋2 小时前
基于DJL的LSTM水文预报模型训练完整指南
人工智能·rnn·lstm
猎嘤一号2 小时前
博弈论(Game Theory)的理论、算法与工程
人工智能·算法·安全·博弈论
V哥AI增长2 小时前
Schema.org 结构化数据与GEO技术落地:AI引擎引用机制与JSON-LD部署实证研究
大数据·运维·人工智能
马拉AI2 小时前
腾讯开源 Agent 记忆系统,AI“换对话就忘”的问题有了新解法(附安装使用教程)
人工智能·算法·开源·科研
IT_陈寒2 小时前
JavaScript类型转换把我坑惨了,这破玩意真该早点搞明白
前端·人工智能·后端
用户938515635072 小时前
手写一个 LLM Harness 框架:用工程化手段把大模型幻觉踩在脚下
javascript·人工智能·后端
前端开发江鸟2 小时前
我能解释 RAG、MCP 和 Eval,却画不出一条完整的 Agent 链路
人工智能
ivywriter3 小时前
【具身智能】物理AI具体指什么,和具身智能是什么关系?
人工智能