CV从入门到精通到入土
传统计算机视觉(Traditional CV)就像是一门图像的炼金术,你不依赖现在的深度学习(AI),而是纯靠数学和像素的把戏来达成目的。
我们不写大段代码,只聊“这是啥”、“有啥用”、“什么时候用”以及“经典连招”。函数名以最常用的 OpenCV (Python) 为例。
准备好了吗?我们开始发车,直奔入土!
第一阶段:入门 (The Basics) —— 让你看懂图像的本质
这个阶段的核心是:把复杂的图像变成简单的数字矩阵。
1. 色彩空间转换 (Color Space Conversion)
- 概念: 图像默认是 RGB(红绿蓝),但这种格式对算法很不友好(比如光线一暗,RGB三个值全变)。
- 常用操作:
- 灰度化 (Grayscale): 彩色变黑白。90%的CV算法第一步,因为处理单通道比三通道快多了。(
cv2.cvtColor) - 转 HSV: 色调(H)、饱和度(S)、亮度(V)。当你需要按颜色提取东西时必用(比如只提取画面里的红色苹果),因为H通道不受光照影响。
- 灰度化 (Grayscale): 彩色变黑白。90%的CV算法第一步,因为处理单通道比三通道快多了。(
- 什么时候用: 拿到图的第一步。
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:提取答题卡/文档/车牌号的外框
问题: 在复杂背景下找出一个矩形框。
- 灰度化 (排除颜色干扰)
- 高斯滤波 (消除背景纹理和噪点)
- Canny边缘检测 (勾勒出所有物体的线条)
- 膨胀 (因为Canny画出的线条可能断裂,膨胀一下把线连死)
- 找轮廓 (
cv2.findContours) - 多边形拟合 (过滤掉不是4个顶点的轮廓,锁定那个最大的矩形)
连招 B:数一数培养皿里有多少个细胞 / 画面里有多少硬币
问题: 细胞粘在一起,怎么分开计数?
- 灰度化 -> Otsu二值化 (黑白分离,细胞变白,背景变黑)
- 形态学开运算 (干掉周围游离的杂质)
- 距离变换 (Distance Transform) (核心!计算每个白点到黑边的距离,越靠近细胞中心的点越亮,边缘越暗)
- 再次二值化 (只保留最亮的中心点,这样粘在一起的细胞就只剩下各自孤立的中心了)
- 连通域分析 (数一数图上有几个白点,就是几个细胞)。(
cv2.connectedComponents)
连招 C:去除图片上的水印或划痕
问题: 图片上有细长的破坏痕迹。
- 二值化提取划痕 (把划痕变成纯白,其他全黑,作为Mask掩膜)
- 膨胀掩膜 (把划痕稍微扩大一点点,确保完全覆盖)
- 图像修复 (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 的泥潭里玩得开心!