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 等 )

  • API :cv2.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 中实现复杂形变。

五、阈值处理

(一)固定阈值

  • API :ret, 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 需展示每种阈值的效果,分析对图像的影响(如二值化突出黑白对比 )。

(二)自适应阈值

  • API :dst = 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. 考点关联 :作业中涉及的函数(imread、cvtColor、threshold、findContours 等 )是考试重点,熟记参数和应用场景。
  3. 流程梳理:如作业 3 轮廓检测流程(去噪→二值化→找轮廓→分析特征 ),对应复习笔记中 "轮廓检测" 模块,确保步骤清晰。

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

相关推荐
Zhao-Jichao43 分钟前
AI Prompting for Everyone 课程笔记 - P21 总结 Conclusion
人工智能·笔记
欢欢李1 小时前
【LTE L3 笔记 05】LTE同步信号
笔记·无线通信·物理层·lte·空口协议
La Pulga3 小时前
【FreeRTOS源码学习笔记】空闲任务与阻塞延时
笔记·mcu·学习·嵌入式·freertos·实时操作系统
蒸蒸yyyyzwd3 小时前
秋招学习笔记 day106
笔记·学习
小李不想当小白4 小时前
WDG看门狗(STM32标准库学习笔记)
笔记·stm32·单片机·嵌入式硬件·学习·嵌入式
欢欢李4 小时前
【LTE L3 笔记 04】LTE帧结构
笔记·无线通信·物理层·lte·空口协议
Zhao-Jichao7 小时前
AI Prompting for Everyone 课程笔记 - P20 实验与期末项目 Lab and Final Project
前端·人工智能·笔记
Z21-X7 小时前
云原生运维实战笔记:企业网站综合上云部署与云运维服务全景解析
运维·笔记·学习·云原生
坤坤子吖7 小时前
Linux网络编程:UDP进阶,从字典服务器到简单聊天室
linux·服务器·网络·c++·笔记·学习
Rabitebla8 小时前
【Linux学习笔记】进程篇(九):进程的创建与退出——fork、写时拷贝与退出码
linux·c++·笔记·学习