OpenCV复习笔记

一、图像数据源读取

(一)静态图像读取

  • API 函数cv2.imread(filename, flags)
    • 作业场景:读取作业要求的图片(如作业 1 读图绘制矩形、作业 2 读图处理颜色通道 )。
    • 关键参数:flags 常用 cv2.IMREAD_COLOR(默认 BGR 读入 )、cv2.IMREAD_GRAYSCALE(作业 2 阈值处理、作业 3 轮廓检测常用灰度图 )。
    • 示例:img = cv2.imread('task_img.jpg', cv2.IMREAD_GRAYSCALE)(作业 2 阈值处理前置 )

(二)动态图像(视频)读取(基础)

  • 摄像头 / 视频文件cap = cv2.VideoCapture(0)(摄像头 )或 cap = cv2.VideoCapture('video.mp4')(视频 ),逐帧用 ret, frame = cap.read() 获取,最后 cap.release() 释放。
  • 作业关联:若作业涉及视频(如后续拓展 ),流程一致,可用于动态画面处理(如画圆标记 )。

二、图像基础操作

(一)鼠标交互绘制(鼠标画矩形 )

  • 实现逻辑
    1. 定义鼠标回调函数:def mouse_callback(event, x, y, flags, param) ,判断 event 类型(如 cv2.EVENT_LBUTTONDOWN 按下、cv2.EVENT_LBUTTONUP 抬起 ),记录矩形起点、终点坐标。
    2. 绑定回调:cv2.setMouseCallback(window_name, mouse_callback)
    3. 循环显示图像,根据坐标绘制矩形:cv2.rectangle(img, (x1,y1), (x2,y2), (0,255,0), 2)

(二)颜色通道操作(分区域改颜色通道 )

  • 通道拆分与合并

    • 拆分:b, g, r = cv2.split(img)(BGR 顺序 ),作业 1 中 "上部三分之一改红色"→ 对应区域 r 通道赋值 255 。
    • 合并:img_merge = cv2.merge((b, g, r)) ,将修改后的通道合并回图像。
  • 作业示例:

    复制代码
    height, width = img.shape[:2]
    # 上部三分之一区域
    img[:height//3, :, 2] = 255  # 红色通道(BGR 中 R 是第三个通道 )
    img[height//3:2*height//3, :, 0] = 255  # 蓝色通道(B 是第一个通道 )
    img[2*height//3:, :, 1] = 255  # 绿色通道(G 是第二个通道 )

(三)图像叠加(作业 1 要求:三种方式叠加两张图 )

  • 方法 1:直接加权(cv2.addWeighted

    复制代码
    res = cv2.addWeighted(img1, 0.5, img2, 0.5, 0)  # 权重和为 1,0 是 gamma 值
  • 方法 2:按位运算(cv2.bitwise_and/or/not
    需确保图像大小、通道一致,适合遮罩叠加:

    复制代码
    mask = cv2.threshold(gray_img, 127, 255, cv2.THRESH_BINARY)[1]
    res = cv2.bitwise_and(img1, img2, mask=mask)
  • 方法 3:手动遍历像素叠加
    逐像素计算 res[i,j] = alpha*img1[i,j] + beta*img2[i,j] ,效率低但灵活,作业中用于理解原理。

三、颜色空间转换

(一)基础转换(RGB ↔ HSV 等 )

  • APIcv2.cvtColor(src, code) ,作业 2 要求 RGB→HSV 转换,示例:

    复制代码
    hsv_img = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)  # OpenCV 读入是 BGR,先转 RGB 再转 HSV 更直观(或直接转 ,注意顺序 )
  • 通道含义

    • HSV 中 H(0 - 180 )、S(0 - 255 )、V(0 - 255 ),作业 2 可通过调整 H 通道实现颜色筛选(如提取红色物体 )。

(二)作业场景应用(区分 R、G、B 通道 )

  • 拆分通道:b, g, r = cv2.split(img) ,单独显示 / 处理每个通道,作业 2 中观察颜色分布。
  • 通道可视化:将单通道(如 R )扩展为三通道(cv2.merge((r, r, r)) ),方便在彩色窗口显示灰度通道。

四、几何变换

(一)平移、缩放、旋转、放射变换

  • 平移

    复制代码
    M = np.float32([[1, 0, tx], [0, 1, ty]])
    dst = cv2.warpAffine(img, M, (width, height))

    作业 2 中按要求平移图像,如 tx=50, ty=30 右移、下移。

  • 缩放

    复制代码
    dst = cv2.resize(img, (new_width, new_height), interpolation=cv2.INTER_LINEAR)

    作业 2 需指定缩放尺寸(如 (width*2, height*2) 放大 )。

  • 旋转

    复制代码
    M = cv2.getRotationMatrix2D((center_x, center_y), angle, scale)
    dst = cv2.warpAffine(img, M, (width, height))

    作业 2 中旋转角度(如 angle=45 度 ),scale=1 保持尺寸。

  • 放射变换

    定义变换前后的点对,计算矩阵 M = cv2.getAffineTransform(src_pts, dst_pts) ,再用 warpAffine 变换,作业 2 中实现复杂形变。

五、阈值处理

(一)固定阈值

  • APIret, dst = cv2.threshold(src, thresh, maxval, type)

  • 作业场景(5 种类型示例 ):

    复制代码
    # 二值化
    _, dst_bin = cv2.threshold(gray_img, 127, 255, cv2.THRESH_BINARY)  
    # 反二值化
    _, dst_bin_inv = cv2.threshold(gray_img, 127, 255, cv2.THRESH_BINARY_INV)  
    # 截断
    _, dst_trunc = cv2.threshold(gray_img, 127, 255, cv2.THRESH_TRUNC)  
    # 置零
    _, dst_tozero = cv2.threshold(gray_img, 127, 255, cv2.THRESH_TOZERO)  
    # 反置零
    _, dst_tozero_inv = cv2.threshold(gray_img, 127, 255, cv2.THRESH_TOZERO_INV)  

    作业 2 需展示每种阈值的效果,分析对图像的影响(如二值化突出黑白对比 )。

(二)自适应阈值

  • APIdst = cv2.adaptiveThreshold(src, maxval, adaptiveMethod, thresholdType, blockSize, C)
  • 作业对比:与固定阈值对比,展示对光照不均图像(如文档 )的优化效果。

六、平滑滤波

(一)常用滤波方法

  • 均值滤波cv2.blur(img, (3,3)) ,简单平均,作业 2 中观察模糊效果。
  • 高斯滤波cv2.GaussianBlur(img, (3,3), 0) ,去高斯噪声,边缘保留更好。
  • 中值滤波cv2.medianBlur(img, 3) ,去椒盐噪声(作业 2 中若有噪声图,效果显著 )。
  • 双边滤波cv2.bilateralFilter(img, 9, 75, 75) ,保边去噪(同时考虑空间距离和颜色差异 ),作业 2 中处理纹理图像。

七、轮廓检测与物体标识

(一)轮廓检测流程

  1. 预处理
    • 转灰度:gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    • 阈值 / 边缘检测:_, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)(或 Canny )
  2. 找轮廓
    contours, hierarchy = cv2.findContours(binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
  3. 分析轮廓
    • 质心坐标:M = cv2.moments(contour)cx = int(M['m10']/M['m00'])cy = int(M['m01']/M['m00'])
    • 面积:area = cv2.contourArea(contour)
    • 最小外切圆:(x,y), radius = cv2.minEnclosingCircle(contour)
  4. 绘制与报告
    cv2.drawContours 画轮廓,cv2.circle 画质心、外切圆,按实验报告模板整理流程、代码、结果。

八、形态学操作

(一)腐蚀与膨胀

  • 腐蚀cv2.erode(binary, kernel, iterations=1) ,消除小噪点、细化轮廓。
  • 膨胀cv2.dilate(binary, kernel, iterations=1) ,连接断开区域、填充空洞。
  • 作业应用:作业 3 中对阈值后的二值图预处理,提升轮廓检测准确性。

九、视频处理基础

(一)核心操作

  • 读视频 / 摄像头cap = cv2.VideoCapture(0) ,循环 ret, frame = cap.read() 获取帧。
  • 绘制操作 :在帧上用 cv2.circle(frame, (x,y), radius, (0,255,0), 2) 画圆,实现动态标记(如跟踪鼠标点击 )。
  • API 英译中VideoCapture(视频捕获 )、imshow(显示 )、waitKey(延时 )、circle(画圆 )等,作业 1 中需准确调用。

十、复习策略(结合作业)

  1. 代码复现:把三次作业代码重新跑通,梳理每一步 API 作用(如作业 1 鼠标回调、作业 2 颜色通道修改、作业 3 轮廓质心计算 )。
  2. 考点关联 :作业中涉及的函数(imreadcvtColorthresholdfindContours 等 )是考试重点,熟记参数和应用场景。
  3. 流程梳理:如作业 3 轮廓检测流程(去噪→二值化→找轮廓→分析特征 ),对应复习笔记中 "轮廓检测" 模块,确保步骤清晰。

提示:复习时结合作业代码,重点关注老师要求的 "前三次作业重中之重" 内容,尤其是作业 1 的交互绘制、作业 2 的多变换组合、作业 3 的轮廓分析,这些是考试实操题的原型!

相关推荐
一只侯子13 小时前
Face AE Tuning
图像处理·笔记·学习·算法·计算机视觉
whale fall15 小时前
【剑雅14】笔记
笔记
星空的资源小屋17 小时前
跨平台下载神器ArrowDL,一网打尽所有资源
javascript·笔记·django
Xudde.17 小时前
Quick2靶机渗透
笔记·学习·安全·web安全·php
AA陈超18 小时前
Git常用命令大全及使用指南
笔记·git·学习
愚戏师19 小时前
Python3 Socket 网络编程复习笔记
网络·笔记
降临-max19 小时前
JavaSE---网络编程
java·开发语言·网络·笔记·学习
大白的编程日记.20 小时前
【计算网络学习笔记】MySql的多版本控制MVCC和Read View
网络·笔记·学习·mysql
IMPYLH21 小时前
Lua 的 require 函数
java·开发语言·笔记·后端·junit·lua
YJlio1 天前
进程和诊断工具学习笔记(8.29):ListDLLs——一眼看清进程里加载了哪些 DLL,谁在偷偷注入
android·笔记·学习