梯度求法和sobel之类的算子雷同,甚至更简单,就是一个离散差分,不清楚的童鞋可以百度,一大堆资料呢,从源码也可清晰的看出原理。
// 方向导数,求梯度
/* * @parameter sz: 图像大小 * @parameter pGray: 图像灰度值 * @parameter pGradx: 图像x轴梯度 * @parameter pGrady: 图像y轴梯度 * @parameter pMag : 图像梯度幅值 */void Grad(SIZE sz, LPBYTE pGray,int *pGradX, int *pGradY, int *pMag)
{ LONG y,x;//中间变量
double dSqt1; double dSqt2;//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方向方向导数
for(x=1;x<sz.cx-1;x++) { for(y=1;y<sz.cy-1;y++) { pGradY[y*sz.cx +x] = (int)(pGray[(y+1)*sz.cx +x] - pGray[(y-1)*sz.cx +x]); } }//求梯度
for(y=0; y<sz.cy; y++) { for(x=0; x<sz.cx; x++) { //二阶范数求梯度 dSqt1 = pGradX[y*sz.cx + x]*pGradX[y*sz.cx + x]; dSqt2 = pGradY[y*sz.cx + x]*pGradY[y*sz.cx + x]; pMag[y*sz.cx+x] = (int)(sqrt(dSqt1+dSqt2)+0.5);//四舍五入 } }}用到的类型:
typedef struct {
int cy; int cx;} SIZE;typedef unsigned char *LPBYTE;
typedef long LONG;
http://blog.csdn.net/crzy_sparrow/article/details/6999133