图像边缘检测非极大值抑制求解释
请看这段代码
// 如果当前象素的梯度幅度为 0,则不是边界点
if(pnMag[nPos] == 0 )
{
pUncheckRst[nPos] = 0 ;
}
else
{
dTmp = pnMag[nPos] ;
gx = pnGradX[nPos] ; // 水平方向偏导数
gy = pnGradY[nPos] ; // 垂直方向偏导数
if (abs(gy) > abs(gx))
{
weight = fabs(gx)/fabs(gy); // 计算插值的比例
g2 = pnMag[nPos-imageWidth] ;
g4 = pnMag[nPos+imageWidth] ;
// 如果两个方向的偏导数的符号相同
// C 是当前象素,与 g1-g4 的位置关系为:
// g1 g2
// C
// g4 g3
if (gx*gy > 0)
{
g1 = pnMag[nPos-imageWidth-1] ;
g3 = pnMag[nPos+imageWidth+1] ;
}
// 如果两个方向的偏导数的符号相反
// C 是当前象素,与 g1-g4 的位置关系为:
// g2 g1
// C
// g3 g4
else
{
g1 = pnMag[nPos-imageWidth+1] ;
g3 = pnMag[nPos+imageWidth-1] ;
}
}
else
{
weight = fabs(gy)/fabs(gx);
g2 = pnMag[nPos+1] ;
g4 = pnMag[nPos-1] ;
// 如果两个方向的偏导数的符号相同
// C 是当前象素,与 g1-g4 的位置关系为:
// g3
// g4 C g2
// g1
if (gx*gy > 0)
{
g1 = pnMag[nPos+imageWidth+1] ;
g3 = pnMag[nPos-imageWidth-1] ;
}
// 如果两个方向的偏导数的符号相反
// C 是当前象素,与 g1-g4 的位置关系为:
// g1
// g4 C g2
// g3
else
{
g1 = pnMag[nPos-imageWidth+1] ;
g3 = pnMag[nPos+imageWidth-1] ;
}
}
// 下面利用 g1-g4 对梯度进行插值
{
dTmp1 = weight*g1 + (1-weight)*g2 ;
dTmp2 = weight*g3 + (1-weight)*g4 ;
// 当前象素的梯度是局部的最大值
// 该点可能是个边界点
if(dTmp>=dTmp1 && dTmp>=dTmp2)
{
pUncheckRst[nPos] = 128 ;
}
else
{
// 不可能是边界点
pUncheckRst[nPos] = 0 ;
}
}
}
}
}
}
小弟有以下几个问题:(1) 插值是何意?为啥取g1,g2为一组,g3,g4为一组计算插值?
(2) 原理上是比较3*3矩阵内相邻像素点是不是最大值,他为何比较g1,g2,g3,g4就完事了
(3) 为何要分X,Y方向导数谁大两种情况比较