⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄

📁 数字图象处理中图象分割的原代码,可运行在多种环境
💻
字号:
void CreatGauss(double sigma, double **pdKernel, int *pnWidowSize); 

void GaussianSmooth(SIZE sz, LPBYTE pGray, LPBYTE pResult, double sigma); 

void Grad(SIZE sz, LPBYTE pGray, int *pGradX, int *pGradY, int *pMag); 

void NonmaxSuppress(int *pMag, int *pGradX, int *pGradY, SIZE sz, LPBYTE pNSRst); 

void EstimateThreshold(int *pMag, SIZE sz, int *pThrHigh, int *pThrLow, LPBYTE pGray, 
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++) 
{ 
//y方向滤波 
for(x=0; x<sz.cx;x++) 
{ 
for(y=0; y<sz.cy; y++) 
{ 
dDotMul = 0; 
dWeightSum = 0; 
for(i=(-nLen);i<=nLen;i++) 
{ 
if((i+y)>=0 && (i+y)< sz.cy) 
{ 
dDotMul += (double)pdTemp[(y+i)*sz.cx+x]*pdKernel[nLen+i]; 
dWeightSum += pdKernel[nLen+i]; 
} 
} 
pResult[y*sz.cx+x] = (unsigned char)dDotMul/dWeightSum; 
} 
} 
delete []pdKernel; 
pdKernel = NULL; 
delete []pdTemp; 
pdTemp = NULL; 
} 
// 方向导数,求梯度 
void Grad(SIZE sz, LPBYTE pGray,int *pGradX, int *pGradY, int *pMag) 
{ 
LONG y,x; 
//x方向的方向导数 
for(y=1;y<sz.cy-1;y++) 
{ 
for(x=1;x<sz.cx-1;x++) 
{ 
pGradX[y*sz.cx +x] = (int)( pGray[y*sz.cx+x+1]-pGray[y*sz.cx+ x-1] ); 
} 
} 

//y方向方向导数 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -