canny算子四部曲之二(求梯度)

        梯度求法和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;



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值