题目重点:说明Sobel方向导数核、平滑与差分,区分梯度响应、阈值边缘和Canny完整流程。
题意与假设
这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。
- 灰度二维图,3×3 Sobel为示例;按常见图像相关运算布局写核,真卷积翻转会改导数符号而非边缘幅值。
- 边界padding、尺度和输入数值类型明确,题目未明确图像/方向/阈值,不声称实际题只接受Sobel。
解题路线
- Gx核=[−1,0,1;−2,0,2;−1,0,1],Gy为其转置。水平方向差分[-1,0,1]与正交方向平滑[1,2,1]的外积,既抓强度变化又减少部分噪声。
- 对常量块两核响应0;左右强度跳变时Gx大,对上下跳变Gy大。幅值sqrt(Gx²+Gy²)、方向atan2(Gy,Gx),方向与边缘线切向不同。
- 梯度响应不是已经得到干净边界:可先降噪,再阈值;噪声/纹理也有高梯度,尺度与阈值会改变召回/误检。不能说所有大梯度都是语义物体边。
- Canny是平滑、梯度、非极大抑制与双阈值连接等流程,不是一个叫Canny的固定3×3卷积核。Prewitt/Scharr/Laplacian等方向/阶数/尺度特性不同,先问考官关注哪一类。
- 用signed/float中间类型保留负导数,不在uint8里截断/溢出后再求幅值;padding在图边缘可能造成假边,输出大小与边界模式需要合约。
- 检验样例常量、水平/垂直斜坡、单阶跃与噪声,解释响应与尺度,而不只背核名字。实际CV pipeline如后接NN特征,传统kernel角色需与项目设计一致。
手动走一遍
自拟3×3块每行[0,0,10],Gx=10+20+10=40,Gy=0;常量全10两响应0。若方向核被卷积翻转,Gx为−40,幅值仍40但方向符号要一致。
规模与取舍
固定3×3滤波O(HW)时间,可分离核减少常数;输出梯度/幅值O(HW)存储或按行流式。较大k×k直接O(HWk²),可分离O(HWk),不把所有edge detector都固定同成本。
易错点与追问
容易失分的边界
- Canny当单核。
- 导数符号在uint8丢失。
- 边缘方向与梯度方向混淆。
- padding假边。
- 所有梯度当语义轮廓。
继续深挖
- Scharr与Sobel差异如何评?
- 改变scale为什么会改变响应阈值?
- 彩色图怎样定义梯度?
- Laplacian二阶导数和一阶梯度怎样比较?
技术参考
- OpenCV Sobel Derivatives 官方教程:方向导数核方法参考;训练数值样例自拟。
