真实面经题目 · 原创解析
OpenCV里边缘检测怎么做的?
OpenCV 边缘检测常见流程是灰度化、去噪、计算梯度、非极大值抑制和阈值连接。面试中可以重点讲 Canny,也可以补充 Sobel、Scharr、Laplacian 等算子分别适合检测一阶或二阶变化。
真实面经题目 · 原创解析
OpenCV 边缘检测常见流程是灰度化、去噪、计算梯度、非极大值抑制和阈值连接。面试中可以重点讲 Canny,也可以补充 Sobel、Scharr、Laplacian 等算子分别适合检测一阶或二阶变化。
OpenCV 中常用 Canny 做边缘检测。一般先把图像转灰度并做高斯滤波降噪,再用 Sobel 计算 x、y 方向梯度,得到梯度幅值和方向;随后做非极大值抑制,让边缘变细;最后用双阈值和滞后连接区分强边缘、弱边缘和噪声。简单场景也可以直接用 Sobel、Scharr 或 Laplacian 检测灰度变化。
边缘通常对应图像灰度或颜色发生剧烈变化的位置。算法上会用梯度来衡量变化强度,一阶梯度大的位置可能是边缘,二阶变化也可以用于检测零交叉。不同算子本质上是在近似图像局部变化。
实际检测前通常先转灰度并做滤波。噪声本身也会造成灰度突变,如果不降噪,梯度算子会把噪声当成边缘。高斯滤波是 Canny 流程中的常见选择,能平滑图像但也会牺牲部分细节。
Sobel 会分别计算水平方向和垂直方向的梯度,再合成梯度幅值和方向。Scharr 可以看作更精细的 Sobel 变体,Laplacian 使用二阶导数,对噪声更敏感。选择哪个算子取决于精度、噪声和速度要求。
Canny 不只是算梯度。它还会做非极大值抑制,把宽边缘压细;再用双阈值把边缘分成强边缘、弱边缘和非边缘;弱边缘如果与强边缘连接,则保留,否则丢弃,从而减少噪声造成的孤立边缘。
边缘检测效果很依赖高斯核大小、阈值、图像分辨率和光照条件。阈值太低会产生大量噪声,阈值太高会漏掉弱边缘。工程中常结合形态学操作、轮廓检测或语义模型完成后续任务。
因为梯度对噪声敏感,噪声也会产生高频变化。高斯滤波能先平滑噪声,减少后续被误检为边缘的点。
高阈值确定强边缘,低阈值保留可能的弱边缘。弱边缘只有和强边缘连接时才保留,这样能兼顾连续性和抗噪声能力。
Sobel 是一阶梯度算子,能得到方向信息;Laplacian 是二阶导数算子,对边缘和噪声都更敏感,通常需要更强的平滑预处理。