1、边缘检测概述:什么是边缘检测
各位同学好,我是你们这门课的老张。做嵌入式视觉这些年,我接触过不少算法,但要说最基础、最常用的,还得是边缘检测。
说白了,边缘检测就是找出图像中亮度变化剧烈的地方。你想想看,一张照片里,物体和背景的分界线、物体的轮廓、纹理的边界——这些地方像素值会突然跳变。边缘检测算法就是专门抓这种跳变的。
我记得刚入行那会儿,带我的师傅跟我说过一句话:「边缘是图像的眼睛」。这么多年下来,我越来越觉得这话有道理。很多高级视觉任务,比如目标识别、三维重建、图像分割,第一步往往都是先做边缘检测。
边缘检测的核心思想
边缘检测本质上是一个微分运算。图像是离散的二维信号,我们对它求一阶导数或二阶导数。一阶导数的极大值点对应边缘,二阶导数的过零点也对应边缘。
嗯,这里要注意:实际图像是有噪声的。直接求导会把噪声也放大。所以标准的做法是:先平滑,再求导。这就是为什么几乎所有边缘检测算子都包含一个高斯滤波步骤。
核心公式(一维情况):
一阶导数:f'(x) ≈ f(x+1) - f(x)
二阶导数:f''(x) ≈ f(x+1) - 2f(x) + f(x-1)
在二维图像中,我们分别对x方向和y方向求偏导,然后合成梯度幅值和方向。
边缘检测的应用场景
我这些年做过的项目里,边缘检测几乎无处不在。挑三个典型的说说。
自动驾驶
自动驾驶里,边缘检测是感知层的基石。车道线检测、障碍物识别、交通标志牌定位——这些任务的第一步几乎都是边缘提取。
我曾经参与过一个ADAS项目,当时用的就是Canny边缘检测配合霍夫变换做车道线检测。说实话,效果还不错。但有个坑:夜间或者雨雾天气,边缘信息会变得很弱。后来我们加了自适应阈值处理,才把鲁棒性提上来。
- 车道线检测:边缘提取后做直线拟合
- 行人/车辆检测:边缘轮廓作为候选区域
- 可行驶区域分割:边缘信息辅助语义分割
医疗影像
医疗影像这块,边缘检测主要用于器官分割和病灶定位。CT图像里,肿瘤和正常组织的边界往往就是边缘。
我记得有个项目是做肺结节检测。CT图像中,结节的边缘通常比较模糊,而且周围有血管干扰。直接用标准Canny算法,要么漏检,要么误检太多。后来我们改用了各向异性扩散滤波做预处理,效果才明显改善。
我的经验:医疗影像对精度要求极高。嵌入式平台上做医疗影像处理,算法选型要格外谨慎。我个人习惯先用PC端验证算法效果,确认无误后再做嵌入式移植。
工业质检
工业质检是我做的最多的领域。说白了,就是让机器代替人眼去检查产品有没有缺陷。
举个例子:手机屏幕的划痕检测。划痕在图像中就是一条细长的边缘。我们用边缘检测算法提取所有可能的划痕,然后根据长度、宽度、方向等特征做筛选。
我曾经踩过一个坑:某次做PCB板焊点检测,环境光照变化导致边缘检测结果忽好忽坏。后来我加了一个光照归一化步骤,问题才解决。嗯,做嵌入式视觉,环境适应性永远是第一位的。
| 应用场景 | 典型任务 | 常用算法 | 嵌入式难点 |
|---|---|---|---|
| 自动驾驶 | 车道线检测 | Canny + Hough | 实时性要求高(30fps以上) |
| 医疗影像 | 病灶分割 | Sobel + 形态学 | 精度要求高,内存受限 |
| 工业质检 | 缺陷检测 | Laplacian + 自适应阈值 | 光照变化,环境干扰 |
课程目标与学习路径
这门课的目标很明确:让你能在嵌入式平台上跑通边缘检测算法,并且跑得又快又稳。
具体来说,学完这门课,你应该能做到:
- 理解原理:从数学推导到代码实现,搞清楚边缘检测的来龙去脉
- 动手移植:把OpenCV里的边缘检测算法移植到ARM、DSP或FPGA上
- 性能优化:学会使用NEON指令集、SIMD、定点化等技巧加速算法
- 工程落地:处理内存管理、帧率控制、异常处理等实际问题
避坑指南:我曾经见过不少同学,一上来就追求高大上的算法,结果在嵌入式平台上跑不动。我的建议是:先跑通最简单的Sobel算子,再逐步升级到Canny、Laplacian。循序渐进,才是正道。
学习路径建议
我个人习惯把学习路径分成三个阶段:
第一阶段:基础夯实(第1-4章)
搞懂边缘检测的数学原理,手写实现Sobel、Prewitt、Canny等经典算法。这个阶段不要用OpenCV封装好的函数,自己写一遍,印象才深。
第二阶段:嵌入式移植(第5-8章)
把算法移植到具体的嵌入式平台上。我会以STM32和RK3588为例,手把手带你完成从PC到嵌入式的代码迁移。
第三阶段:优化与实战(第9-12章)
性能优化、多线程加速、定点化处理。最后做一个完整的工业质检项目,把学到的知识串起来。
你想想看,如果能把边缘检测算法在嵌入式平台上跑得又快又准,那其他视觉算法移植起来也会轻松很多。这门课就是帮你打好这个基础。
好了,概述部分就到这里。下一章我们开始讲Sobel算子,从最经典的边缘检测算法入手。到时候我会分享一些我在项目中踩过的坑,保证让你少走弯路。