C语言实现Sobel法求边缘

在这里插入图片描述

在这里插入图片描述

/*Sobel法求边缘
*****注意数据类型
*参数   data[row][col]   图像数据
*参数   thr              阈值
*使用注意 需要重定义数据类型
*需要引用头文件math.h
*typedef unsigned char  uint8;
*typedef unsigned int   uint16;
*数组传递都是按地址传递 所以可以不需要返回值
*/
#define SIMPLIFY 0  /*
                    *SIMPLIFY = 0 使用简化近似式
                    *SIMPLIFY = 1 不使用简化近似式
                    *SIMPLIFY = 2 MAX(Gx , Gy) */
#define ROW 5  //行数
#define COL 5  //列数
void getSide_Sobel(uint8 data[][COL] , uint8 thr)
{
	int Gx = 0;//水平方向
	int Gy = 0;//垂直方向
	int G  = 0;
    uint8 position[ROW][COL] = {0};//记录边缘点的数组

	//依次处理每个像素
	for(uint8 i = 1 ; i < ROW - 1 ; i++)
	{
		for(uint8 j = 1 ; j < COL - 1 ; j++)
		{
			//根据公式进行卷积运算
			Gx = (data[i - 1][j + 1] + 2 * data[i][j + 1] + data[i + 1][j + 1]) -
                    (data[i - 1][j - 1] + 2 * data[i][j - 1] + data[i + 1][j - 1]);

			Gy = (data[i - 1][j - 1] + 2 * data[i - 1][j] + data[i - 1][j + 1]) -
                    (data[i + 1][j - 1] + 2 * data[i + 1][j] + data[i + 1][j + 1]);

			//根据用户自定义的计算精度计算
			#if (SIMPLIFY == 0)
				G = (abs(Gx) + abs(Gy)) / 2;//取绝对值
			#elif (SIMPLIFY == 1)
				G = sqrt(Gx * Gx + Gy * Gy);//取平方根
			#elif (SIMPLIFY == 2)
				G = MAX(abs(Gx) , abs(Gy));//取最大
			#endif

			//根据设定的阈值判断
            if(G > thr)
            {
                //记录当前边缘位置
                position[i][j] = 255;
            }
		}
	}

    //依次处理每个像素
	for(uint8 i = 0 ; i < ROW ; i++)
	{
		for(uint8 j = 0 ; j < COL ; j++)
		{
             data[i][j] = position[i][j];
        }
    }
}
  • 4
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值