|
double dRatHigh, double dRatLow);
void Hysteresis(int *pMag, SIZE sz, double dRatLow, double dRatHigh, LPBYTE pResult);
void TraceEdge(int y, int x, int nThrLow, LPBYTE pResult, int *pMag, SIZE sz);
void Canny(LPBYTE pGray, SIZE sz, double sigma, double dRatLow, double dRatHigh, LPBYTE pResult);
#include "afx.h" #include "math.h" #include "canny.h"
// 一维高斯分布函数,用于平滑函数中生成的高斯滤波系数 void CreatGauss(double sigma, double **pdKernel, int *pnWidowSize) {
LONG i;
//数组中心点 int nCenter;
//数组中一点到中心点距离 double dDis;
//中间变量 double dValue; double dSum; dSum = 0;
// [-3*sigma,3*sigma] 以内数据,会覆盖绝大部分滤波系数 *pnWidowSize = 1+ 2*ceil(3*sigma);
nCenter = (*pnWidowSize)/2;
*pdKernel = new double[*pnWidowSize];
//生成高斯数据 for(i=0;i<(*pnWidowSize);i++) { dDis = double(i - nCenter); dValue = exp(-(1/2)*dDis*dDis/(sigma*sigma))/(sqrt(2*3.1415926)*sigma); (*pdKernel)[i] = dValue; dSum+=dValue;
} //归一化 for(i=0;i<(*pnWidowSize);i++) { (*pdKernel)[i]/=dSum; }
}
//用高斯滤波器平滑原图像 void GaussianSmooth(SIZE sz, LPBYTE pGray, LPBYTE pResult, double sigma) { LONG x, y; LONG i;
//高斯滤波器长度 int nWindowSize;
//窗口长度 int nLen;
//一维高斯滤波器 double *pdKernel;
//高斯系数与图像数据的点乘 double dDotMul; //滤波系数总和 double dWeightSum; double *pdTemp; pdTemp = new double[sz.cx*sz.cy];
//产生一维高斯数据 CreatGauss(sigma, &pdKernel, &nWindowSize);
nLen = nWindowSize/2; //x方向滤波 for(y=0;y<sz.cy;y++) { for(x=0;x<sz.cx;x++) { dDotMul = 0; dWeightSum = 0; for(i=(-nLen);i<=nLen;i++) { //判断是否在图像内部 if((i+x)>=0 && (i+x)<sz.cx) { dDotMul+=(double)pGray[y*sz.cx+(i+x)] * pdKernel[nLen+i];
上一篇:微软靠卖软件赚钱,Google OS靠什么赚钱
下一篇:05年的经典语录之计算机科学
|