2026年8月1日星期六
今天学习计算机视觉。
一、计算机视觉定义
计算机视觉(Computer Vision, CV):让计算机模仿人类视觉系统,从图像、视频中获取信息、理解内容;通过算法对画面进行检测、分割、识别、变换等操作。
计算机视觉分为两大分支:
- 传统图像处理(经典计算机视觉):人工设计算法与特征规则,无需训练神经网络,代表工具:OpenCV(这次学习的内容)
- 基于深度学习的计算机视觉:利用神经网络自动学习图像特征,需要数据集训练,代表方向:图像分类、目标检测、语义分割(YOLO、CNN 等)
二、OpenCV 传统图像处理
1. 图像读取、显示、保存与窗口控制
OpenCV 特性:默认读取彩色图像通道顺序为BGR(普通图片软件、matplotlib 使用 RGB,顺序不一样)
cv2.imread(路径, 读取标识)- 默认:加载彩色图像
cv2.IMREAD_GRAYSCALE:直接以灰度单通道读取图片
cv2.imshow(窗口名称, 图像数据):创建窗口展示图像cv2.waitKey(延时ms)- 参数 = 0:无限等待按键;大于 0:等待指定毫秒
- 返回按键 ASCII 码;ESC 按键编码为 27,常用来退出程序
cv2.destroyAllWindows():销毁全部窗口,释放内存资源(规范写法,防止内存占用)cv2.imwrite(保存路径,图像):将处理后的图像保存到本地
2. 图像基础属性与 ROI 感兴趣区域
图像本质是多维 numpy 数组:
img.shape:(高度 H, 宽度 W, 通道数);灰度图只有 (H,W)
img.size:图像总像素数量
img.dtype:像素数据类型,常规图像为uint8(像素范围 0~255)
ROI 感兴趣区域利用 numpy 切片提取图像局部区域:img[起始高:结束高, 起始宽:结束宽]用途:截取目标区域、局部打码、图片局部叠加。
3. 视频读取操作
cv2.VideoCapture(地址):读取本地视频 / 摄像头
isOpened()判断视频是否成功打开
ret, frame = video.read():逐帧读取画面- ret:布尔值,判断是否成功读到帧
- frame:当前帧图像(和图片格式一致,BGR 数组)
- 循环持续读取每一帧,实现视频播放
- 程序结束必须调用
.release(),释放视频流资源
4. 颜色通道操作、色彩空间转换
彩色图像三维结构[H,W,通道]
[:,:,0]→ B 蓝色通道
[:,:,1]→ G 绿色通道
[:,:,2]→ R 红色通道
通道分离:b,g,r = cv2.split(img)
通道合并:img = cv2.merge((b,g,r))
cv2.cvtColor(图像, 转换模式)色彩空间转换cv2.COLOR_BGR2GRAY:彩色转灰度cv2.COLOR_BGR2RGB:BGR 转为 RGBcv2.COLOR_BGR2HSV:转换到 HSV 空间(常用于颜色筛选)
5. 图像缩放 cv2.resize ()
函数:cv2.resize(src, dsize, fx, fy)
src:原始图像
dsize:(宽度,高度),直接指定输出图像尺寸
fx、fy:水平、垂直方向缩放比例,dsize 设为 None 时生效示例:cv2.resize(img,None,fx=0.5,fy=0.5)图像长宽缩小一半
6. 图像像素算术运算
(1)直接相加img1 + img2
像素求和遵循取模运算,数值超过 255 时:总和 - 256例:260 → 4,画面容易出现异常噪点。
(2)cv2.add(img1,img2)饱和加法
像素相加上限锁定 255,超过 255 直接取 255;图像融合、提亮优先使用该 API
7. 边界填充 cv2.copyMakeBorder ()
作用:在图像上下左右扩充像素边框参数:src, top, bottom, left, right, borderType, value
top/bottom/left/right:四个方向扩充宽度
borderType 填充模式:
cv2.BORDER_CONSTANT:填充固定颜色,配合 value 设置颜色
cv2.BORDER_REPLICATE:直接复制图像最边缘像素向外延伸
cv2.BORDER_REFLECT:镜面反射,包含边界像素镜像复制
cv2.BORDER_REFLECT_101(默认):镜像反射,不重复边界像素,最常用
cv2.BORDER_WRAP:循环平铺方式填充
8. 阈值分割 threshold(二值化核心)
函数:ret, dst = cv2.threshold(灰度图, thresh, maxval, type)
thresh:设定阈值
maxval:最大值(仅二值模式生效)返回:ret = 使用的阈值;dst = 处理完成图像
五种阈值模式:
cv2.THRESH_BINARY:大于阈值→maxval,其余置 0
cv2.THRESH_BINARY_INV:反向二值,大于阈值置 0,其余设 maxval
cv2.THRESH_TRUNC:超过阈值统一改为阈值,低于阈值保持原值
cv2.THRESH_TOZERO:低于阈值归零,高于阈值不变
cv2.THRESH_TOZERO_INV:高于阈值归零,低于阈值不变
9. 图像噪声与滤波(平滑去噪)
椒盐噪声
随机在图像生成黑点 (像素 0)、白点 (像素 255) 脉冲噪声。
四类滤波器
均值滤波 cv2.blur ()【线性滤波】邻域内所有像素求平均值,实现画面模糊;无法有效去除椒盐噪声。参数:cv2.blur(图像,(核宽,核高))
方框滤波 cv2.boxFilter ()【线性滤波】
normalize=True:等价均值滤波(求平均)
normalize=False:邻域像素直接求和,容易像素溢出发白
高斯滤波 cv2.GaussianBlur ()【线性滤波】根据像素距离赋予权重,近处像素权重更高,模糊效果更加自然;适合去除高斯噪声。
中值滤波 cv2.medianBlur ()【非线性滤波】邻域像素排序后取中间值;专门消除椒盐噪声。