//非最大抑制
void NonmaxSuppress(int *pMag, int *pGradX, int *pGradY, SIZE sz, LPBYTE pNSRst)
{
LONG y,x;
int nPos;
//梯度分量
int gx;
int gy;
//中間變量
int g1,g2,g3,g4;
double weight;
double dTmp,dTmp1,dTmp2;
//設(shè)置圖像邊緣為不可能的分界點(diǎn)
for(x=0;x<sz.cx;x++)
{
pNSRst[x] = 0;
pNSRst[(sz.cy-1)*sz.cx+x] = 0;
}
for(y=0;y<sz.cy;y++)
{
pNSRst[y*sz.cx] = 0;
pNSRst[y*sz.cx + sz.cx-1] = 0;
}
for(y=1;y<sz.cy-1;y++)
{
for(x=1;x<sz.cx-1;x++)
{
//當(dāng)前點(diǎn)
nPos = y*sz.cx + x;
//如果當(dāng)前像素梯度幅度為0,則不是邊界點(diǎn)
if(pMag[nPos] == 0)
{
pNSRst[nPos] = 0;
}
else
{
//當(dāng)前點(diǎn)的梯度幅度
dTmp = pMag[nPos];
//x,y方向?qū)?shù)
gx = pGradX[nPos];
gy = pGradY[nPos];
//如果方向?qū)?shù)y分量比x分量大,說明導(dǎo)數(shù)方向趨向于y分量
if(abs(gy) > abs(gx))
{
//計(jì)算插值比例
weight = fabs(gx)/fabs(gy);
g2 = pMag[nPos-sz.cx];
g4 = pMag[nPos+sz.cx];
//如果x,y兩個(gè)方向?qū)?shù)的符號(hào)相同
//C 為當(dāng)前像素,與g1-g4 的位置關(guān)系為:
//g1 g2
// C
// g4 g3
if(gx*gy>0)
{
g1 = pMag[nPos-sz.cx-1];
g3 = pMag[nPos+sz.cx+1];
}
//如果x,y兩個(gè)方向的方向?qū)?shù)方向相反
//C是當(dāng)前像素,與g1-g4的關(guān)系為:
// g2 g1
// C
// g3 g4
else
{
g1 = pMag[nPos-sz.cx+1];
g3 = pMag[nPos+sz.cx-1];
}
}
//如果方向?qū)?shù)x分量比y分量大,說明導(dǎo)數(shù)的方向趨向于x分量
else
{
//插值比例
weight = fabs(gy)/fabs(gx);
g2 = pMag[nPos+1];
g4 = pMag[nPos-1];
//如果x,y兩個(gè)方向的方向?qū)?shù)符號(hào)相同
//當(dāng)前像素C與 g1-g4的關(guān)系為
// g3
// g4 C g2
// g1
if(gx * gy > 0)
{
g1 = pMag[nPos+sz.cx+1];
g3 = pMag[nPos-sz.cx-1];
}
//如果x,y兩個(gè)方向?qū)?shù)的方向相反
// C與g1-g4的關(guān)系為
// g1
// g4 C g2
// g3
else
{
g1 = pMag[nPos-sz.cx+1];
g3 = pMag[nPos+sz.cx-1];
}
}
//利用 g1-g4 對(duì)梯度進(jìn)行插值
{
dTmp1 = weight*g1 + (1-weight)*g2;
dTmp2 = weight*g3 + (1-weight)*g4;
//當(dāng)前像素的梯度是局部的最大值
//該點(diǎn)可能是邊界點(diǎn)
if(dTmp>=dTmp1 && dTmp>=dTmp2)
{
pNSRst[nPos] = 128;
}
else
{
//不可能是邊界點(diǎn)
pNSRst[nPos] = 0;
}
}
}
}
}
}