CV从入门到精通到入土

传统计算机视觉(Traditional CV)就像是一门图像的炼金术,你不依赖现在的深度学习(AI),而是纯靠数学和像素的把戏来达成目的。

我们不写大段代码,只聊“这是啥”、“有啥用”、“什么时候用”以及“经典连招”。函数名以最常用的 OpenCV (Python) 为例。

准备好了吗?我们开始发车,直奔入土!

第一阶段:入门 (The Basics) —— 让你看懂图像的本质

这个阶段的核心是:把复杂的图像变成简单的数字矩阵。

1. 色彩空间转换 (Color Space Conversion)

  • 概念: 图像默认是 RGB(红绿蓝),但这种格式对算法很不友好(比如光线一暗,RGB三个值全变)。
  • 常用操作:
    • 灰度化 (Grayscale): 彩色变黑白。90%的CV算法第一步,因为处理单通道比三通道快多了。(cv2.cvtColor)
    • 转 HSV: 色调(H)、饱和度(S)、亮度(V)。当你需要按颜色提取东西时必用(比如只提取画面里的红色苹果),因为H通道不受光照影响。
  • 什么时候用: 拿到图的第一步。

2. 二值化 (Binarization / Thresholding)

  • 概念: “非黑即白”。设定一个阈值(比如127),大于它的像素全变白(255),小于的全变黑(0)。
  • 进阶概念:
    • Otsu大津法: 不知道阈值设多少?用它,算法自动帮你找一个最完美的切割点。
    • 自适应阈值 (Adaptive Threshold): 如果图片一边亮一边暗(阴影),全局阈值会翻车。自适应会把图片切成小块,每块算自己的阈值。
  • 什么时候用: 抠图、提取文字、把目标和背景彻底分离。(cv2.threshold, cv2.adaptiveThreshold)

3. 几何变换 (Geometric Transformations)

  • 概念: 缩放、旋转、平移、翻转。
  • 什么时候用: 统一图片大小,或者做数据增强。(cv2.resize, cv2.warpAffine)

第二阶段:精通 (The Core) —— 像素级的奇技淫巧

这个阶段的核心是:玩弄相邻像素之间的关系(卷积与形态学)。

1. 图像平滑/降噪 (Blurring / Filtering)

照片上总会有噪点,直接处理会爆炸,必须先“磨皮”。

  • 均值滤波 / 高斯滤波 (Gaussian Blur): 类似于近视眼看世界,边缘会变模糊。专门对付一般的高频白噪声。(cv2.GaussianBlur)
  • 中值滤波 (Median Blur): 专门对付椒盐噪声(画面上随机的黑白麻点)。它不讲武德,直接取周围像素的中位数,能完美抹掉麻点且保留边缘。
  • 什么时候用: 二值化或边缘检测之前的必做前置动作,不降噪直接提取边缘绝对全是碎渣子。

2. 形态学操作 (Morphological Operations) —— 重点!

这是处理二值图(黑白图)的绝对核心。假设白色是你想要的目标,黑色是背景

  • 腐蚀 (Erosion):
    • 概念: 消除边缘的白色像素,让白色区域“瘦身”。
    • 作用: 抹掉画面里微小的白色噪点,或者把两个粘在一起的白块强行断开。(cv2.erode)
  • 膨胀 (Dilation):
    • 概念: 扩大边缘的白色像素,让白色区域“发胖”。
    • 作用: 填补白块内部的小黑洞,或者把断裂的一条线重新接上。(cv2.dilate)
  • 开运算 (Opening = 先腐蚀,后膨胀):
    • 神技! 专门用来消除目标外面的噪点。先腐蚀把外面的小毛刺和噪点灭掉,这时候主体也瘦了,再用膨胀让主体恢复原状。(外面干净了)。
  • 闭运算 (Closing = 先膨胀,后腐蚀):
    • 神技! 专门用来填补目标内部的黑洞。先膨胀把里面的黑洞挤满,这时候主体胖了,再用腐蚀让主体边缘缩回原状。(里面实心了)。
  • 形态学梯度 (Gradient = 膨胀图 减去 腐蚀图):
    • 作用: 胖子减去瘦子,剩下的就是外壳。直接得到目标的轮廓边缘。(cv2.morphologyEx)

3. 边缘检测 (Edge Detection)

  • 概念: 找图像里像素值剧烈变化的地方(往往就是物体的边界)。
  • Canny 算法: CV界最经典的边缘检测算子。画出来的边缘是一条极细的纯净白线。
  • 什么时候用: 当你需要测量物体尺寸、找形状(圆、矩形)时。(cv2.Canny)

第三阶段:经典连招 (The Pipelines) —— 见证奇迹的时刻

懂得招式没用,得会打连招。以下是 CV 工程师最常用的套路。

连招 A:提取答题卡/文档/车牌号的外框

问题: 在复杂背景下找出一个矩形框。

  1. 灰度化 (排除颜色干扰)
  2. 高斯滤波 (消除背景纹理和噪点)
  3. Canny边缘检测 (勾勒出所有物体的线条)
  4. 膨胀 (因为Canny画出的线条可能断裂,膨胀一下把线连死)
  5. 找轮廓 (cv2.findContours)
  6. 多边形拟合 (过滤掉不是4个顶点的轮廓,锁定那个最大的矩形)

连招 B:数一数培养皿里有多少个细胞 / 画面里有多少硬币

问题: 细胞粘在一起,怎么分开计数?

  1. 灰度化 -> Otsu二值化 (黑白分离,细胞变白,背景变黑)
  2. 形态学开运算 (干掉周围游离的杂质)
  3. 距离变换 (Distance Transform) (核心!计算每个白点到黑边的距离,越靠近细胞中心的点越亮,边缘越暗)
  4. 再次二值化 (只保留最亮的中心点,这样粘在一起的细胞就只剩下各自孤立的中心了)
  5. 连通域分析 (数一数图上有几个白点,就是几个细胞)。(cv2.connectedComponents)

连招 C:去除图片上的水印或划痕

问题: 图片上有细长的破坏痕迹。

  1. 二值化提取划痕 (把划痕变成纯白,其他全黑,作为Mask掩膜)
  2. 膨胀掩膜 (把划痕稍微扩大一点点,确保完全覆盖)
  3. 图像修复 (Inpainting) (算法根据掩膜边缘的正常像素,向内推测并填补颜色)。(cv2.inpaint)

第四阶段:入土 (The Grave) —— 数学与脱发的地狱

当你觉得上面的东西太简单,开始追求极致的稳定性和原理时,你就半截入土了。现在的AI虽然强大,但在算力极低(如单片机)或要求绝对可解释性的工业视觉中,这些仍是天神级别的存在。

1. 频域分析 (傅里叶变换 Fourier Transform)

  • 概念: 把图像从“像素矩阵”变成“频率图”。平滑的区域是低频,边缘和噪点是高频。
  • 入土操作: 在频域里直接把高频部分切掉一块再转回图像,你会发现某种特定的规律性网纹(比如扫描出的摩尔纹)神奇地消失了。

2. 霍夫变换 (Hough Transform)

  • 概念: 极坐标系下的空间映射。
  • 作用: 你的图里哪怕线断成了几十截,哪怕圆被遮挡了一半,霍夫变换都能靠数学硬生生把这根直线或者给找出来。工业上用来检测零件圆孔极其好用。(cv2.HoughLines, cv2.HoughCircles)

3. 手工特征提取三巨头 (SIFT / SURF / HOG)

  • 概念: 深度学习(CNN)出现之前的CV霸主。为了让计算机认出一个水杯,前辈们用极其复杂的数学公式计算局部梯度方向直方图。
  • 神迹: SIFT 提取的特征点,无论你怎么把图片旋转、缩放、甚至改变亮度,它都能精准匹配到两张图中的同一个点(常用于全景图拼接)。

4. 相机标定与3D几何 (Camera Calibration)

  • 入土原因: 镜头有畸变(鱼眼效果)。为了用摄像头做高精度测量(精确到0.01毫米),你需要拿一个标定板(黑白棋盘格)在镜头前各个角度拍几十张图,解算相机的内参矩阵(焦距、光心)和畸变系数,然后做图像去畸变。里面全是矩阵求导和非线性优化。(cv2.calibrateCamera)

总结指南

  • 想找轮廓/边缘: 灰度 -> 滤波去噪 -> Canny/二值化 -> findContours。
  • 二值化后全是麻点: 开运算(除外噪) / 闭运算(补内洞)。
  • 光照不均匀扣不出图: 自适应阈值 (Adaptive Threshold)。
  • 找规则图形: 霍夫变换(直线/圆)。

计算机视觉是一门靠“试”出来的玄学,调参(比如膨胀的核大小是 3x3 还是 5x5)占据了传统 CV 工程师 80% 的生命。祝你在 OpenCV 的泥潭里玩得开心!