图像预处理是计算机视觉流程的关键第一步,旨在优化图像质量,使其更适合后续的分析和算法处理。OpenCV 提供了以下几类核心预处理函数:
一、图像预处理函数
1. 颜色空间转换
- 函数:
cv::cvtColor- 功能与作用: 负责在不同的颜色模型(如 BGR、灰度、HSV、HLS 等)之间进行转换。其主要作用是简化数据维度或提取颜色特征。
- 适用场景:
- 灰度化: 当图像内容仅依赖于亮度信息时(例如边缘检测、背景减法 MOG2、光流法),将 BGR 图像转换为灰度图可以大幅减少计算量,通常是 1/31/31/3。
- HSV/HLS 转换: 在需要基于特定颜色(如交通标志、特定颜色的车辆)进行识别和跟踪时,HSV/HLS 空间比 BGR 更能稳定地表示颜色信息,因为它将亮度(V/L)与色调(H)和饱和度(S)分离。
2. 滤波与平滑(降噪)
滤波旨在消除图像中的各种噪声,平滑细节,为后续的精确处理做准备。
-
函数:
cv::GaussianBlur(高斯模糊)- 功能与作用: 使用高斯核进行加权平均,对图像进行平滑处理。它会降低图像中的高频成分。由于是加权平均,它在降噪的同时,对保留主要边缘结构的效果比均值滤波要好。
- 适用场景: 消除高斯噪声。常作为许多算法(如 Canny 边缘检测、背景减法)的预处理步骤,以减少噪声对结果的影响。
-
函数:
cv::medianBlur(中值滤波)- 功能与作用: 用像素邻域中的中值来代替中心像素的值。
- 适用场景: 消除椒盐噪声(Salt-and-Pepper Noise)。中值滤波是一种非线性滤波,在去除这类噪声时效果显著,同时由于其选取中值,能比均值滤波更好地保护图像的边缘不被过度模糊。
-
函数:
cv::bilateralFilter(双边滤波)- 功能与作用: 一种高级滤波方法。它不仅考虑像素的空间距离(进行平滑),还考虑像素的强度差(保留边缘)。
- 适用场景: 需要在去除噪声的同时,最大程度地保留清晰的边缘和纹理细节,常用于图像增强和计算摄影。
3. 二值化与阈值处理
二值化用于将灰度图像转换为只有黑白两色的图像,是图像分割的基础。
-
函数:
cv::threshold(全局阈值)- 功能与作用: 根据一个固定的全局阈值将图像像素分成两类。大于阈值的设置为最大值(如 255),小于的设置为 0。作用是快速地将感兴趣目标从背景中分离出来。
- 适用场景: 光照均匀、对比度高的图像分割,或者像您的代码一样,对背景减法器输出的前景掩码进行二值化,以获得清晰的二值轮廓。
-
函数:
cv::adaptiveThreshold(自适应阈值)- 功能与作用: 图像的不同区域使用不同的阈值进行二值化。它根据每个像素周围邻域的统计结果(平均值或高斯加权平均)来确定该像素的阈值。
- 适用场景: 处理光照不均匀、存在大片阴影或渐变的图像。例如,扫描文档的文字提取。
-
函数:
cv::threshold(配合 Otsu's 法)- 功能与作用: Otsu's 法(大津法)是一种自动确定最佳全局阈值的方法,它最大化前景和背景像素的类间方差。
- 适用场景: 当图像直方图呈现明显的双峰特性,且希望自动找到最佳分割点时使用。
4. 形态学操作
这些操作主要应用于二值图像,基于图像的形状结构进行处理。
-
函数:
cv::erode(腐蚀)- 功能与作用: 使用结构元素(核)扫描图像,消除前景边界的像素,使白色区域收缩。
- 适用场景: 消除微小的孤立噪点,分离粘连的物体。
-
函数:
cv::dilate(膨胀)- 功能与作用: 使用结构元素,向前景边界添加像素,使白色区域扩张。
- 适用场景: 连接断裂的轮廓,弥补物体内部的小孔洞。在您的车辆计数场景中,有助于连接背景减法器生成的断裂车体轮廓。
-
函数:
cv::morphologyEx(开运算)- 功能与作用: 先腐蚀后膨胀。作用是平滑轮廓,消除图像中的细小凸起和孤立的噪点。
- 适用场景: 清理前景掩码,去除背景减法器产生的微小残影或飞点。
-
函数:
cv::morphologyEx(闭运算)- 功能与作用: 先膨胀后腐蚀。作用是连接断裂的轮廓,填充轮廓中的小孔洞。
- 适用场景: 弥合像车体这种大型物体的轮廓裂缝,确保物体形状的完整性和连续性,以便更准确地进行区域占用判定。
5. 几何变换
用于改变图像的尺寸、方向或校正透视畸变。
-
函数:
cv::resize- 功能与作用: 改变图像的尺寸(放大或缩小)。
- 适用场景: 统一输入尺寸以满足算法要求(如深度学习模型),或缩小图像以加快处理速度。
-
函数:
cv::warpPerspective(透视变换)- 功能与作用: 将图像从一个平面投影到另一个平面,实现透视矫正。
- 适用场景: 校正摄像机的透视畸变,将倾斜的图像转换成"俯视"的视角(鸟瞰图),这对于需要精确测量物体尺寸或位置的交通监控系统非常重要。
二、其他函数
1. 核心操作与数据结构(Core Operations)
这部分包含了所有基础的数据结构和矩阵操作,是所有高级功能的基础。
cv::Mat(Matrix):这是 OpenCV 中最核心的数据结构,用于存储图像、特征、点云、张量等所有数据。其功能包括矩阵的创建、访问、克隆、数学运算(如加、减、乘、除、转置、求逆等)。cv::addWeighted:按权重混合两幅图像(图像融合)。cv::sum,cv::minMaxLoc:对矩阵元素进行求和、求最大最小值及定位。
2. 特征检测与描述(Feature Detection and Description)
这部分用于在图像中定位独特的、可重复识别的关键点,并将这些关键点转化为可比较的数学描述子。
cv::KeyPoint:关键点的数据结构。cv::FastFeatureDetector(FAST):速度极快的角点检测器。cv::ORB::create()(Oriented FAST and Rotated BRIEF):既快又具有旋转不变性的特征描述子,常用于实时应用。cv::SIFT::create()(Scale-Invariant Feature Transform):尺度不变特征变换,对图像的尺度和旋转具有不变性,但计算量较大。cv::AKAZE::create():更快的、对尺度和旋转具有不变性的特征描述子。- 适用场景: 图像配准、目标识别、三维重建、SLAM(同步定位与地图构建)。
3. 目标跟踪(Object Tracking / Video Analysis)
这部分功能用于处理视频流,实现运动物体的检测和追踪。
cv::BackgroundSubtractorMOG2/cv::BackgroundSubtractorKNN:背景减法器。用于从视频中分离出前景运动目标(如您代码中用于车辆检测),是运动目标检测的基础。cv::calcOpticalFlowFarneback(光流法):用于计算图像中所有像素的运动向量,常用于稠密光流。cv::Tracker系列(如 KCF, CSRT, GOTURN 等):用于在视频帧之间持续追踪特定目标的位置。cv::CamShift:基于颜色直方图的自适应目标跟踪。- 适用场景: 视频监控、行为分析、实时目标追踪、运动检测。
4. 图像分割与轮廓处理(Segmentation and Contours)
用于将图像划分成具有相似特性的区域,或提取对象的边界。
cv::findContours:在二值图像中查找所有轮廓(即物体的边界)。在您的车辆计数中,这是识别完整车体轮廓的关键一步。cv::drawContours:绘制找到的轮廓。cv::approxPolyDP:对轮廓进行多边形拟合,简化复杂的曲线轮廓。cv::boundingRect:计算包围轮廓的最小矩形。cv::watershed:基于流域(Watershed)算法进行图像分割,常用于分离粘连的物体。cv::GrabCut:用于交互式前景提取,基于能量优化实现对前景的精细分割。- 适用场景: 物体计数、形状分析、图像掩码创建、图像编辑中的前景提取。
5. 计算机视觉几何学与校准(Geometric Vision and Calibration)
用于处理相机的几何模型和空间关系。
cv::calibrateCamera:相机标定。通过一系列棋盘格图像,计算相机的内参矩阵和畸变系数。cv::undistort:使用标定结果消除图像的径向和切向畸变。cv::stereoCalibrate/cv::StereoBM:立体视觉。用于双目相机标定和计算视差图,进而进行三维深度重建。cv::solvePnP:解决 PnP(Perspective-n-Point)问题,用于通过 2D 图像点和对应的 3D 空间点来计算相机位姿。- 适用场景: 机器视觉、机器人导航、三维重建、精确测量。
6. 机器学习与深度学习(Machine Learning and Deep Learning)
OpenCV 内置了一些经典的机器学习算法,并且提供了强大的深度学习推理(DNN)模块。
cv::ml模块:包含 SVM(支持向量机)、k-NN(K-近邻)、决策树等经典算法。cv::dnn模块 :深度神经网络模块。cv::dnn::readNetFrom...:用于加载主流深度学习框架(如 TensorFlow, PyTorch, Caffe, ONNX)训练的模型文件。cv::dnn::Net::forward:执行推理计算。
- 适用场景: 目标分类、目标检测(如 YOLO、SSD)、语义分割,可以直接在 CPU 或 GPU 上部署已训练的深度学习模型。