//非极大值抑制
/权重的选取,离得近权重大
///
IplImage*N;//非极大值抑制结果
N = cvCreateImage(cvGetSize(ColorImage), ColorImage->depth, 1);
IplImage*OpencvCannyimg;//非极大值抑制的结果
OpencvCannyimg = cvCreateImage(cvGetSize(ColorImage), ColorImage->depth, 1);
int g1 = 0, g2 = 0, g3 = 0, g4 = 0;//用于进行插值,得到亚像素点坐标值
double dTmp1 = 0.0, dTmp2 = 0.0;//保存两个亚像素点插值得到的灰度数据
double dWeight = 0.0;//插值的权重
for (int i = 1; i < nWidth; i++)
{
for (int j = 1; j < nHeight - 1; j++)
{
//如果当前点梯度为0,该点就不是边缘点
if (M[i + j*nWidth] == 0)
{
N->imageData[i + j*nwidthstep] = 0;
}
else
{
///首先判断属于那种情况,然后根据情况插值
///第一种情况
/g1 g2
c
/// g3 g4/
if ((Theta[i + j*nWidth] >= 90 & Theta[i + j*nWidth] < 135) || (Theta[i + j*nWidth] >= 270 & Theta[i + j*nWidth] < 315))
{
//根据斜率和四个中间值进行插值求解
g1 = M[i - 1 + (j - 1)*nWidth];
g2 = M[i + (j - 1)*nWidth];
g3 = M[i + (j - 1)*nWidth];
g4 = M[i + 1 + (j + 1)*nWidth];
dWeight = fabs(p[i + j*nWidth]) / fabs(Q[i + j*nWidth]);//反正切
dTmp1 = g1*dWeight + (1 - dWeight)*g2;
dTmp2 = g4*dWe