/*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];
}
}
}
C语言实现Sobel法求边缘
于 2020-11-24 20:10:32 首次发布