// anny.cpp: implementation of the Canny class.
//
//////////////////////////////////////////////////////////////////////
#include "anny.h"
#include "math.h"
//#include "algorithms.h"
//#include "algorithm.h"
#include "stdlib.h"
//#include "maths.h"
//using namespace std;
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
Canny::Canny(int PicHeight,int PicWidth,double ** PicData,double PicSigma,double PicRatioLow,double PicRatioHigh)
{
iHeight=PicHeight;
iWidth=PicWidth;
iData=PicData;
sigma=PicSigma;
dRatioLow=PicRatioLow;
dRatioHigh=PicRatioHigh;
}
Canny::~Canny()
{
}
void Canny::CannyArith(int **iEdgePoint)
{
int i;
int **iGradX ; // 指向x方向导数的指针
int **iGradY ; // 指向y方向导数的指针
int **iExtent ; // 梯度的幅度
iGradX=new int *[iHeight];
for(i=0;i<iHeight;i++)
iGradX[i]=new int[iWidth];
iGradY=new int *[iHeight];
for(i=0;i<iHeight;i++)
iGradY[i]=new int[iWidth];
iExtent=new int *[iHeight];
for(i=0;i<iHeight;i++)
iExtent[i]=new int[iWidth];
// 对原图象进行滤波
GaussionSmooth();
// 计算X,Y方向上的方向导数
DirGrad(iGradX,iGradY);
// 计算梯度的幅度
GradExtent(iGradX,iGradY,iExtent);
// 应用non-maximum 抑制
NonMaxSuppress(iExtent,iGradX,iGradY,iEdgePoint);
// 应用Hysteresis,找到所有的边界
Hysteresis(iExtent,iEdgePoint);
// 释放内存
for(i=0;i<iHeight;i++)
delete []*(iGradX+i);
delete iGradX;
for(i=0;i<iHeight;i++)
delete []*(iGradY+i);
delete iGradY;
for(i=0;i<iHeight;i++)
delete []*(iExtent+i);
delete iExtent;
}
void Canny::GaussionSmooth()
{
int i,j,k; //循环变量
int iWindowSize; //记录模板大小的变量
int iHalfLen; //模板大小的一半