当前位置: 首页 > news >正文

sobel算子边缘提取及程序优化(C语言)

文章目录

  • sobel算子边缘提取及程序优化(C语言)
    • 1. 利用高斯模糊
    • 2. sobel算子提取边缘的原理
    • 2. sobel算子的C语言实现

sobel算子边缘提取及程序优化(C语言)

1. 利用高斯模糊

直接使用边缘检测算子,提取出的信息过多,使用高斯模糊滤去一些不必要的信息

根据正态分布,获取高斯模糊的归一化卷积核如下
在这里插入图片描述
直接对原图进行高斯模糊(以大小为120*188的灰度图为例)

void Gaussain_Blur() {
	uint8_t* map;
	uint8_t* my_map;
	//float Gaussain_Blur[9] = {0.075, 0.124, 0.075, 0.124, 0.204, 0.124, 0.075, 0.124, 0.075};
	float Gaussain_Blur[9] = { 0.0947416, 0.118318, 0.0947416, 0.118318, 0.147761, 0.118318, 0.0947416, 0.118318, 0.0947416 };
	uint8_t temp_fix[9];
	uint8_t Blur_image[CAMERA_H][CAMERA_W];

	map = fullBuffer;	// 获取原灰度图
	for (int j = 0; j < CAMERA_W; ++j) {	// 第一行不做处理
		Blur_image[0][j] = *(map);
		map++;
	}
	for (int i = 1; i < CAMERA_H - 1; ++i) {
		Blur_image[i][0] = *(map);	// 第一列不做处理
		map++;
		/* 高斯模糊 */
		for (int j = 1; j < CAMERA_W - 1; ++j) {
			temp_fix[0] = *(map - CAMERA_W - 1);
			temp_fix[1] = *(map - CAMERA_W);
			temp_fix[2] = *(map - CAMERA_W + 1);
			temp_fix[3] = *(map - 1);
			temp_fix[4] = *(map);
			temp_fix[5] = *(map + 1);
			temp_fix[6] = *(map + CAMERA_W - 1);
			temp_fix[7] = *(map + CAMERA_W);
			temp_fix[8] = *(map + CAMERA_W + 1);
			float fix_sum = 0;
			for (int k = 0; k < 9; ++k) {
				fix_sum += (float)temp_fix[k] * Gaussain_Blur[k];
			}
			Blur_image[i][j] = (int)fix_sum;
			map++;
		}
		Blur_image[i][CAMERA_W - 1] = *(map); // 最后一列不做处理
		map++;
	}
	for (int j = 0; j < CAMERA_W; ++j) { // 最后一行不做处理
		Blur_image[CAMERA_H - 1][j] = *(map);
		map++;
	}
}

2. sobel算子提取边缘的原理

s o b e l sobel sobel算子是 3*3 的矩阵,利用如下矩阵对图像进行卷积可以获取图像大的竖直边界和水平边界信息。

G Y = [ − 1 0 1 − 2 0 2 − 1 0 1 ] G_Y=\begin{bmatrix}-1 & 0 & 1 \\ -2 & 0 & 2 \\ -1 & 0 & 1 \\ \end{bmatrix} GY= 121000121      G X = [ − 1 − 2 − 1 0 0 0 1 2 1 ] G_X =\begin{bmatrix}-1 & -2 & -1 \\ 0 & 0 & 0 \\ 1 & 2 & 1 \\ \end{bmatrix} GX= 101202101

对图像的某九宫格进行卷积后,获取到的边缘像素信息如下

G i m a g e = [ f ( x − 1 , y − 1 ) f ( x , y − 1 ) f ( x + 1 , y − 1 ) f ( x − 1 , y ) f ( x , y ) f ( x + 1 , y ) f ( x − 1 , y + 1 ) f ( x , y + 1 ) f ( x + 1 , y + 1 ) ] G_{image}= \begin{bmatrix} f(x-1, y-1) & f(x, y-1) & f(x+1, y-1) \\ f(x-1, y) & f(x, y) & f(x+1, y)\\ f(x-1, y+1) & f(x, y+1) & f(x+1, y+1)\\ \end{bmatrix} Gimage= f(x1,y1)f(x1,y)f(x1,y+1)f(x,y1)f(x,y)f(x,y+1)f(x+1,y1)f(x+1,y)f(x+1,y+1)

为了方便理解,将图像九宫格信息标号

G i m a g e = [ p i x 1 p i x 2 p i x 3 p i x 4 p i x 5 p i x 6 p i x 7 p i x 8 p i x 9 ] G_{image}= \begin{bmatrix} pix_1 & pix_2 & pix_3 \\ pix_4 & pix_5 & pix_6\\ pix_7 & pix_8 & pix_9\\ \end{bmatrix} Gimage= pix1pix4pix7pix2pix5pix8pix3pix6pix9

G E D G E c o l o m = G X ∗ G i m a g e = − p i x 1 − 2 p i x 2 − p i x 3 + p i x 7 + 2 p i x 8 + p i x 9 G_{EDGE_{colom}} = G_X * G_{image} = -pix_1 -2pix_2 - pix_3 + pix_7 + 2pix_8 + pix_9 GEDGEcolom=GXGimage=pix12pix2pix3+pix7+2pix8+pix9

G E D G E r o w = G Y ∗ G i m a g e = − p i x 1 − 2 p i x 4 − p i x 7 + p i x 3 + 2 p i x 6 + p i x 9 G_{EDGE_{row}} = G_Y * G_{image} = -pix_1 - 2pix_4 - pix_7 + pix_3 + 2pix_6 + pix_9 GEDGErow=GYGimage=pix12pix4pix7+pix3+2pix6+pix9

最后根据卷积结果获得一个灰度值

G p i x 5 = G E D G E c o l o m 2 + G E D G E r o w 2 G_{pix_5} = \sqrt{G_{EDGE_{colom}}^2 + G_{EDGE_{row}}^2} Gpix5=GEDGEcolom2+GEDGErow2

2. sobel算子的C语言实现

代码实现

void Sobel_get_edge(void) {
	uint8_t* map;
	uint8_t* my_map;
	uint8_t pix_1 = 0;
	uint8_t pix_2 = 0;
	uint8_t pix_3 = 0;
	uint8_t pix_4 = 0;
	uint8_t pix_5 = 0;
	uint8_t pix_6 = 0;
	uint8_t pix_7 = 0;
	uint8_t pix_8 = 0;
	uint8_t pix_9 = 0;

	map = &Blur_image[0][0];	// 对高斯模糊之后的图像进行边缘提取
	for (int i = 0; i < CAMERA_H - 2; i++) {
		IMG[i][0] = *(map);	// 处理结果存储在IMG中
		map++;
		my_map = &IMG[i][1];
		for (int j = 1; j < 188 - 1; j++) {
			pix_1 = *(map - 1);
			pix_2 = *(map);
			pix_3 = *(map + 1);
			pix_4 = *(map + CAMERA_W - 1);
			pix_5 = *(map + CAMERA_W);
			pix_6 = *(map + CAMERA_W + 1);
			pix_7 = *(map + CAMERA_W + CAMERA_W - 1);
			pix_8 = *(map + CAMERA_W + CAMERA_W);
			pix_9 = *(map + CAMERA_W + CAMERA_W + 1);

			int G_x = -pix_1 - 2 * pix_2 - pix_3 + pix_7 + 2 * pix_8 + pix_9;
			int G_y = -pix_1 - 2 * pix_4 - pix_7 + pix_3 + 2 * pix_6 + pix_9;
			*(my_map) = sqrt(G_x * G_x + G_y * G_y);

			map++;
			my_map++;
		}
		IMG[i][CAMERA_W - 1] = *(map);
		map++;
		my_map++;
	}
	for (int j = 0; j < CAMERA_W; ++j) {
		IMG[CAMERA_H - 1][j] = *(map);
		map++;
	}
}

直接对原图进行边缘提取效果并不好,会出现断线、边缘检测过于敏锐等情况
未进行高斯模糊的边界提取效果如下

阈值为100时的二值化结果:
在这里插入图片描述
在这里插入图片描述

使用SCHARR算子结果如下

阈值为100时的二值化结果:

在这里插入图片描述
在这里插入图片描述

阈值改为150
在这里插入图片描述
高斯模糊后的边界提取效果如下
可以看到,高斯模糊之后的边界提取效果更好
在这里插入图片描述
在这里插入图片描述

相关文章:

  • python数据结构与算法
  • cookie,storage,sesstion区别
  • 学生家乡网页设计作品静态HTML网页—— HTML+CSS+JavaScript制作辽宁沈阳家乡主题网页源码(11页)
  • MKD调试下载的时候提示:Contents mismatch at: xxxxxxxxH (Flash=xxH Required=xxH)
  • 【Python基础入门技能树笔记】数据类型-基本数据类型
  • springboot下使用druid-spring-boot-starter
  • PHREEQC建模及典型案例解析与高阶拓展应用【反向“编译”、“玩转”后处理技术、GibbsStudio和PhreePlo方法】
  • Springboot集成Quartz
  • React 18的新特新
  • springboot实验课程辅助管理系统毕业设计-附源码191113
  • Java面向对象(封装,继承,多态,接口)
  • 头门港大屏
  • pip更改为国内源
  • DBCO-PEG-carboxyl COOH-PEG-DBCO 二苯并环辛炔-聚乙二醇-羧酸 羧酸修饰PEG二苯并环辛炔
  • 【Java 语言】4、如何接收用户键盘输入
  • [ JavaScript ] 数据结构与算法 —— 链表
  • [deviceone开发]-do_Webview的基本示例
  • 【跃迁之路】【444天】程序员高效学习方法论探索系列(实验阶段201-2018.04.25)...
  • Akka系列(七):Actor持久化之Akka persistence
  • Android Volley源码解析
  • Centos6.8 使用rpm安装mysql5.7
  • download使用浅析
  • Javascript 原型链
  • JS基础之数据类型、对象、原型、原型链、继承
  • Laravel Telescope:优雅的应用调试工具
  • Nodejs和JavaWeb协助开发
  • Redash本地开发环境搭建
  • Transformer-XL: Unleashing the Potential of Attention Models
  • vue:响应原理
  • 闭包--闭包之tab栏切换(四)
  • 腾讯视频格式如何转换成mp4 将下载的qlv文件转换成mp4的方法
  • 交换综合实验一
  • ​人工智能之父图灵诞辰纪念日,一起来看最受读者欢迎的AI技术好书
  • # Apache SeaTunnel 究竟是什么?
  • # 数论-逆元
  • (06)Hive——正则表达式
  • (二)Pytorch快速搭建神经网络模型实现气温预测回归(代码+详细注解)
  • (二)基于wpr_simulation 的Ros机器人运动控制,gazebo仿真
  • (附源码)SSM环卫人员管理平台 计算机毕设36412
  • (附源码)ssm考生评分系统 毕业设计 071114
  • (免费领源码)Java#Springboot#mysql农产品销售管理系统47627-计算机毕业设计项目选题推荐
  • (十七)Flask之大型项目目录结构示例【二扣蓝图】
  • (学习日记)2024.01.09
  • (原創) 如何刪除Windows Live Writer留在本機的文章? (Web) (Windows Live Writer)
  • *Django中的Ajax 纯js的书写样式1
  • .bat批处理出现中文乱码的情况
  • .FileZilla的使用和主动模式被动模式介绍
  • .NET 材料检测系统崩溃分析
  • .net和jar包windows服务部署
  • .NET框架设计—常被忽视的C#设计技巧
  • .Net中间语言BeforeFieldInit
  • .sdf和.msp文件读取
  • [BZOJ1178][Apio2009]CONVENTION会议中心
  • [bzoj1912]异象石(set)
  • [bzoj2957]楼房重建