轮廓提取demo

news2024/12/28 18:23:43

note

步骤:

1.滤波(使用高斯核对原图卷积)

2.取梯度(使用sobel核对步骤1之后的图卷积得到x,y两个方向的梯度分量)

3.合成梯度图(x,y两个方向的梯度分量相加)

4.取梯度平方和矩阵(x*x + y*y)

5.取八邻域掩膜(3x3矩阵)

6.根据掩膜,合成梯度图,梯度平方和矩阵确定轮廓图中锚点位置的灰度值(保留梯度平方和最大的锚点灰度值为合成梯度图的对应点灰度值)

7.二值化(otsu)

8.膨胀(十字架膨胀)

code

// 轮廓提取
void MyContour(Mat& src, Mat& res) {
	Mat sobelX, sobelY;	// sobel梯度卷积核
	GetSobelMat(sobelX, sobelY);
	
	// 1.高斯滤波
	GaussianBlur(src, res, Size(3,3), 1);

	// 2.soble算子求梯度
	Mat gradX, gradY;
	filter2D(res, gradX, src.type(), sobelX);
	filter2D(res, gradY, src.type(), sobelY);
	Mat grad;	// 梯度合成图
	add(gradX, gradY, grad);

	// 3.求梯度幅值矩阵
	gradX.convertTo(gradX, CV_64FC1);
	gradY.convertTo(gradY, CV_64FC1);
	Mat gradAmplitude(gradX.rows, gradX.cols, gradX.type());
	multiply(gradX, gradX, gradX);
	multiply(gradY, gradY, gradY);
	add(gradX, gradY, gradAmplitude);

	// 4.从梯度合成图筛选出轮廓(若锚点位置梯度幅值最大则保留)
	Mat contour(src.rows, src.cols, src.type(), Scalar(0));	// 轮廓
	// Mat neiberHood = (Mat_<double>(3,3) << 1,1,1,1,0,1,1,1,1); // 8邻域矩阵,掩膜
	Rect roi;
	roi.width = 3;
	roi.height = 3;
	int anchor = roi.width / 2;
	for (int i = 0; i + roi.height <= gradAmplitude.rows; ++i) {
		for (int j = 0; j + roi.width <= gradAmplitude.cols; ++j) {
			roi.x = j;
			roi.y = i;
			double max = 0;
			Mat tmp = gradAmplitude(roi);
			int x = 0;
			int y = 0;
			for (int p = 0; p < tmp.rows; p++) {
				for (int q = 0; q < tmp.cols; q++) {
					if (max < tmp.at<double>(p,q)) {
						max = tmp.at<double>(p,q);
						x = q;
						y = p;
					}
				}
			}
			if (x == anchor) {
				contour.at<uchar>(i,j) =  grad.at<uchar>(i,j);
			}
		}
	}

	// 5.膨胀
	Mat dilateKernel = (Mat_<uchar>(3,3) << 0,255,0,255,255,255,0,255,0);	// 十字架膨胀
	dilate(contour, contour, dilateKernel);
	
	contour.copyTo(res);
	res.convertTo(res, CV_8UC1);

	threshold(res, res, 128, 255, THRESH_BINARY|THRESH_OTSU);

}

test

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/772124.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AIC8800 WIFI调试记录

问题&#xff1a;AIC8800 USB 接口WIFI模块无法识别 现象&#xff1a; 上层&#xff1a;WIFI打不开 驱动层&#xff1a;usb无法识别到AIC8800模块 A133P:/ $ lsusb Bus 001 Device 001: ID 1d6b:0002 Bus 001 Device 002: ID 1a40:0101 Bus 002 Device 001: ID 1d6b:0001 Bus…

postgresql regular lock常规锁申请与释放 内幕 以及fastpath快速申请优化的取舍

​专栏内容&#xff1a; postgresql内核源码分析 手写数据库toadb 并发编程 个人主页&#xff1a;我的主页 座右铭&#xff1a;天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物. 定义 每种常规锁都需要定义几个要素&#xff0c;它由结构体 Lo…

MySQL中这14个小玩意,让人眼前一亮!!!

前言 我最近几年用MYSQL数据库挺多的&#xff0c;发现了一些非常有用的小玩意&#xff0c;今天拿出来分享到大家&#xff0c;希望对你会有所帮助。 1.group_concat 在我们平常的工作中&#xff0c;使用group by进行分组的场景&#xff0c;是非常多的。 比如想统计出用户表中…

跨境电商市场迎来发展新机遇,如何利用IPIDEA扩大市场份额

根据Adobe Analytics的数据&#xff0c;美国消费者在亚马逊Prime Day期间花费了127亿美元&#xff0c;同比增长6.1%&#xff0c;创下历史新高。这一数据表明&#xff0c;亚马逊的会员日促销活动&#xff0c;持续吸引着消费者的关注和购买欲。跨境电商的迅速发展为普通商家提供了…

不得不会的软件测试bug分析定位技巧

目录 1.web前端 2.web后端 3.性能测试 身为测试工程师&#xff0c;总有一道绕不过去的坎就是定位bug&#xff0c;这其实是非常花费时间的。 也许有很多人不以为然&#xff0c;觉得无非就是发现bug后提交bug管理系统&#xff0c;描述操作步骤&#xff0c;预期结果和实际结果…

正则表达式与文本处理器

文本处理器三剑客&#xff1a;grep&#xff08;查找&#xff09; sed awk 正则表达式&#xff1a;由一类特殊字符以及文本字符所编写的一种模式&#xff0c;处理文本当中的内容 其中的一些字符不表示字符的字面含义&#xff0c;这些字符表示控制或者通配的功能 通配符&…

PageHelper分页失效,只能查出第一页

PageHelper分页失效&#xff0c;只能查出第一页 1. 现象2. 原因3. PageHelper工作原理 1. 现象 分页代码如下&#xff1a; int pageId Constants.ONE;boolean isHasNextPage;do {PageHelper.startPage(pageId, Constants.DEFAULT_PAGE_SIZE);List<String> projectIdLi…

python发送邮件yagmail库

yagmail库发送邮件简洁&#xff0c;代码量少 多次测试文件发送只能接收到表、文档、pdf、ppt import yagmaildef send_yagmail(sender, send_password, addressee, hostsmtp.qq.com, port465):yag yagmail.SMTP(sender, send_password, host, port)img_url https://img2.bai…

kali密码攻击之在线攻击hydra

hydra与hydra-graphical 1.介绍 Hydra是一款非常强大的暴力破解工具&#xff0c;它是由著名的黑客组织THC开发的一款开源暴力破解工具。Hydra是一个验证性质的工具&#xff0c;主要目的是&#xff1a;展示安全研究人员从远程获取一个系统认证权限 支持以下协议爆破&#xff1…

Redis实战案例21-消息队列

1. 基于JVM的阻塞队列的局限 JVM内存限制问题&#xff0c;大量订单出现时&#xff0c;可能会超过JVM阻塞队列上限&#xff1b;阻塞队列并不能持久化&#xff0c;因为内存不能持久化&#xff0c;出现异常或者宕机之类的故障时&#xff0c;出现数据丢失&#xff1b; 所以引出消息…

Linux内核的任务:

硬件与软件之间的中间层&#xff1a;内核在技术层面上充当硬件和软件之间的中间层&#xff0c;负责将应用程序的请求传递给硬件&#xff0c;并处理硬件设备和组件的寻址和操作。 应用程序的接口&#xff1a;对于应用程序来说&#xff0c;内核是它们与硬件之间的接口。应用程序通…

基于 chinese-roberta-wwm-ext 微调训练 6 分类情感分析模型

一、模型和数据集介绍 1.1 预训练模型 chinese-roberta-wwm-ext 是基于 RoBERTa 架构下开发&#xff0c;其中 wwm 代表 Whole Word Masking&#xff0c;即对整个词进行掩码处理&#xff0c;通过这种方式&#xff0c;模型能够更好地理解上下文和语义关联&#xff0c;提高中文文…

NAS 问题处理记录

在解决自动配网的过程中&#xff0c;突然NAS不给力&#xff0c;偏偏这个时间找事情。上面这两个问题&#xff0c;说不复杂也不复杂&#xff0c;主要是自己在完全远程处理&#xff0c;很多不方便。当然少不了师弟的助攻&#xff0c;很感谢我的师弟帮忙&#xff0c;实验室的网络不…

Flink 启动就报错,但exception没提示。其中一个task failure 该怎么办?

文章目录 前言一、排查二、解决 前言 最近我在生产又遇到一个问题&#xff0c;就是消费着一段时间之后&#xff0c;忽然就不再消费了&#xff0c;但也不报错。观察了几次&#xff0c;我发现时间基本是停留在上下班高峰期数据量最大的时候。我主观猜测可能是同时间进来的数据过…

css通过子元素选择父元素

伪类:has选择父元素 td:has(> .unfoldTable){//可选中所有td下包含unfoldTable的class标签的td属性color: red; }td:has(> div){//可选中所有td下包含div标签的td属性color: red; } 特殊举例分析&#xff1a; 个别UI框架个别标签通过事件直接生成或者无法选中的情况。…

爆肝整理,Postman接口测试-全局变量/接口关联/加密/解密(超细)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 全局变量和环境变…

随手记——前端安全策略 Content-Security-Policy – CSP

随手记——前端安全策略 Content-Security-Policy – CSP 一、问题 1. 问题&#xff1a;前端meta标签中配置了CSP安全策略&#xff0c;导致使用第三方地图插件的时间报错不展示 2. 原安全配置&#xff1a; <meta http-equiv"Content-Security-Policy" content&…

STM32MP157驱动开发——按键驱动(查询方式)

文章目录 概述APP 读取按键的 4 种方法查询方式休眠-唤醒方式poll 方式异步通知方式 查询方式的按键驱动程序&#xff08;框架&#xff09;按键驱动编写思路board_xxx.cbutton_drv.cbutton_drv.hbutton_test.cMakefile编译测试 查询方式的按键驱动程序(stm32mp157)board_stm32m…

常见Redis使用问题

一 lettuce使用问题 1 问题描述 Redis Cluster集群&#xff0c;当master宕机&#xff0c;主从切换&#xff0c;客户端报错 timed out 2 原因 SpringBoot2.X版本开始Redis默认的连接池都是采用的Lettuce。当节点发生改变后&#xff0c;Letture默认是不会刷新节点拓扑的。 3…

Spring+SpringMvc+Mybatis整合小Demo

原始方式整合SSM 不使用spring-mybatis包 项目内容 整合ssm完成对account表新增和查询的操作 项目大体结构 创建mavenWeb项目 pom文件中引入依赖 spring核心、aspectj(aop)、spring-jdbc(jdbcTemplate)、spring-tx(事务)、 数据源&#xff1a;mysql、c3p0、mybatis my…