# Canny
Canny 就是给图像“画骨架”的艺术。想象一下,你手里有一张照片,你想用钢笔把里面物体的轮廓勾勒出来,Canny 算法做的就是这件事。
## 第一步:打磨(高斯模糊)
**目的:别让噪音骗了你。**
照片里有很多细小的、杂乱的斑点(噪点)。如果你直接找边缘,算法会把这些小斑点也当成边缘,画出来的线条会非常脏。
- **做法**:就像给照片加了一层“美颜滤镜”,把整张图稍微模糊一点。这样,微小的噪声被抹平了,而真正的轮廓(大方向)依然在。
---
## 第二步:找坡度(计算梯度)
**目的:哪里亮度变化大,哪里就有边缘。**
边缘的本质就是“变脸”。比如黑色的头发和白色的皮肤交界处,亮度会突然从很低跳到很高。
- **做法**:算法会扫描全图,找出亮度变化最剧烈的地方。它会记录下两件事:
1. 这里的变化有多猛?(**幅值**)
2. 变化的方向是朝哪里的?(**方向**)
---
## 第三步:瘦身(非极大值抑制)
**目的:只要最细的线条。**
找完坡度后,边缘往往是“胖乎乎”的一团。但我们要的是“骨架”,线条必须只有一个像素宽。
- **做法**:算法会像个严苛的裁判,在每一个边缘区域里走动。如果它发现你这个像素点不是周围一圈里最“猛”的(亮度变化不是最大的),就直接把你踢走。最后,只留下一条最细、最准的线。
---
## 第四步:海选(双阈值)
**目的:区分“真警察”和“假警察”。**
现在线很细了,但里面还是有很多由于光影波动产生的假边缘。
- **做法**:我们设定两条线(高门槛和低门槛):
- **强边缘**:超过高门槛。这肯定是边缘,绝对保留。
- **弱边缘**:在两个门槛之间。可能是边缘,也可能是干扰,待定。
- **垃圾**:低于低门槛。直接扔掉。
---
## 第五步:拯救(滞后跟踪)
**目的:不抛弃,不放弃。**
这是最有人情味的一步。那些“弱边缘”到底留不留?
- **做法**:算法会看这个弱边缘**是否连接着一个强边缘**。
- 如果它是一条长线的一部分(连着强边缘),它就被“救”了,变成真正的边缘。
- 如果它是孤零零的一个点,那它就是噪声,干掉它。
---
## 为什么 Canny 这么厉害?
虽然现在的 AI(深度学习)很火,但 Canny 依然是工业界的“钉子户”,因为它:
1. **快**:不需要昂贵的显卡,用我们之前讨论的 Rust 优化后,手机瞬间就能算完。
2. **准**:它找出来的边缘非常细,且定位极准。
3. **稳**:逻辑清晰,不需要训练模型,在任何光照下表现都很稳定。
**一句话总结:**
> Canny 先把图弄糊,再找亮度变化大的地方,然后把粗线变细,最后只留下那些足够强或者连着强线的线条。