OpenCV——八邻域断点检测

目录

  • 一、理论基础
    • 1、八邻域
    • 2、断点检测
  • 二、代码实现
  • 三、结果展示
  • 四、参考链接

在这里插入图片描述

OpenCV——八邻域断点检测由CSDN点云侠原创,爬虫自重。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫。

一、理论基础

1、八邻域

在这里插入图片描述

图1 八邻域示意图

在这里插入图片描述

图2 八邻域对应坐标关系

2、断点检测

  首先将图像进行二值化,然后检测以 P 1 P_1 P1为中心的它的八个领域,

  • P 2 + P 3 + P 4 + P 5 + P 6 + P 7 + P 8 + P 9 ≤ 255 × 6 P_2+P_3+P_4+P_5+P_6+P_7+P_8+P_9\leq255\times6 P2+P3+P4+P5+P6+P7+P8+P9255×6,则 P 1 P_1 P1点是一个边界点。
  • P 2 + P 3 + P 4 + P 5 + P 6 + P 7 + P 8 + P 9 ≥ 255 × 6 P_2+P_3+P_4+P_5+P_6+P_7+P_8+P_9\geq255\times6 P2+P3+P4+P5+P6+P7+P8+P9255×6,则 P 1 P_1 P1点是一个内部点。
  • P 2 + P 3 + P 4 + P 5 + P 6 + P 7 + P 8 + P 9 = 0 P_2+P_3+P_4+P_5+P_6+P_7+P_8+P_9=0 P2+P3+P4+P5+P6+P7+P8+P9=0,则 P 1 P_1 P1点是一个孤立点。
  • P 2 + P 3 + P 4 + P 5 + P 6 + P 7 + P 8 + P 9 = 255 P_2+P_3+P_4+P_5+P_6+P_7+P_8+P_9=255 P2+P3+P4+P5+P6+P7+P8+P9=255,则 P 1 P_1 P1点是一个端点。
    在这里插入图片描述
图3 点的类型

二、代码实现

#include <opencv2/opencv.hpp>

using namespace std;
using namespace cv;

vector<Point> breakImage(Mat& src);

int main()
{  // 加载RGB图片
	Mat colorImage, grayImage, binImage;
	colorImage = imread("2.png");
	// 显示图片
	namedWindow("原始图像", cv::WINDOW_NORMAL); // 图像窗口函数
	imshow("原始图像", colorImage);
	// 图像二值化
	cvtColor(colorImage, grayImage, COLOR_BGR2GRAY);
	threshold(grayImage, binImage, 1, 255, THRESH_BINARY);

	vector<Point>P;
	P = breakImage(binImage);
	
	int nsize = P.size();
	Mat temp = Mat::zeros(binImage.size(), CV_8UC3);
	// 用圆圈出端点
	for (int i = 0; i < nsize; i++)
	{
		circle(temp, P[i], 10, Scalar(0, 255, 0));
	}
	Mat circleadd;
	
	addWeighted(temp, 1, colorImage, 1, 0, circleadd);
	imwrite("端点.png",circleadd);
	namedWindow("circleadd", cv::WINDOW_NORMAL);
	imshow("circleadd", circleadd);

	waitKey(0);
	   
}
#pragma region//8邻域提取端点
vector<Point> breakImage(Mat& src)
{
	vector<Point> pointxy;
	Point ptPoint;
	Size size = src.size();
	int nSize;

	for (int i = 1; i < size.height - 1; i++)
	{
		uchar* dataPre = src.ptr<uchar>(i - 1);
		uchar* dataCurr = src.ptr<uchar>(i);
		uchar* dataNext = src.ptr<uchar>(i + 1);
		for (int j = 1; j < size.width - 1; j++)
		{
			//  p9 p2 p3    
			//  p8 p1 p4    
			//  p7 p6 p5
			int p1 = dataCurr[j];
			if (p1 != 255) continue;
			int p2 = dataPre[j];
			int p3 = dataPre[j + 1];
			int p4 = dataCurr[j + 1];
			int p5 = dataNext[j + 1];
			int p6 = dataNext[j];
			int p7 = dataNext[j - 1];
			int p8 = dataCurr[j - 1];
			int p9 = dataPre[j - 1];

			if (p1 == 255)
			{
				if ((p2 + p3 + p4 + p5 + p6 + p7 + p8 + p9) == 255)
				{
					ptPoint.x = j;
					ptPoint.y = i;
					pointxy.push_back(ptPoint);
					printf("端点的坐标为:x:%d y:%d\n", j, i);
				}
			}

		}
	}
	nSize = (int)pointxy.size();
	printf("提取端点个数:%d\n", nSize);
	
	return pointxy;
}
#pragma endregion

三、结果展示

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

四、参考链接

[1] 八邻域断点检测
[2] OpenCV 八领域断点检测+断点缺陷修补

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

debian12部署Gitea服务

首先安装git、wget、sqlite&#xff0c;然后进行用户和组的相关设置 sudo apt install -y git wget sqlite3 新增一个git用户与一个git组 sudo adduser --system --group --disabled-password --shell /bin/bash --home /home/git --gecos Git Version Control git 给git用户设…

Echarts 对饼状图上的各模块添加点击事件

文章目录 需求分析 需求 实现 echarts 中饼图点击区块事件 分析 当用户点击饼状图上的各个模块时&#xff0c;我们可以通过 JavaScript 监听 click 事件来实现相应的交互逻辑。 <!DOCTYPE html> <html> <head><meta charset"utf-8"><…

vmware16安装centos9stream

此次下载的是centos9 stream &#xff0c;使用vmware16。因为centos9stream版本比较新&#xff0c;所以vmware16无法识别此系统&#xff0c;不过无伤大雅。但是可能会导致兼容性问题&#xff0c;比如开机关机会很慢&#xff0c;建议还是用vmware17&#xff01; 下载镜像文件&a…

什么是MongoDB

概念&#xff1a; MongoDB 是一个文档数据库&#xff08;以 JSON 为数据模型&#xff09;&#xff0c;由 C 语言编写&#xff0c;旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。 MongoDB 是一个介于关系数据库和非关系数据库之间的产品&#xff0c;是非关系数据库当中…

vue3-列表渲染

v-for 我们可以使用 v-for 指令基于一个数组来渲染一个列表。 v-for 指令的值需要使用 (item in items) 形式的特殊语法&#xff0c;其中 items 是源数据的数组&#xff0c;而 item 是迭代项的别名&#xff0c; (item, index) in items index 表示当前项的位置索引(可选参数)…

MySQL-多表联合查询

&#x1f389;欢迎您来到我的MySQL基础复习专栏 ☆* o(≧▽≦)o *☆哈喽~我是小小恶斯法克&#x1f379; ✨博客主页&#xff1a;小小恶斯法克的博客 &#x1f388;该系列文章专栏&#xff1a;重拾MySQL &#x1f379;文章作者技术和水平很有限&#xff0c;如果文中出现错误&am…

自带操作屏幕,还有AI附体的耳夹式耳机,Sanag塞那S5 Pro体验

如今耳机已经成为了我们生活中不可或缺的存在&#xff0c;很多朋友都喜欢那种能让自己获得身临其境的听觉体验的耳机。但是&#xff0c;传统的入耳式耳机常常会导致耳朵不适&#xff0c;而且特别不适合在户外使用。我最近发现了一款设计很特殊的耳机&#xff0c;就是这副sanag塞…

部署Tomcat

Tomcat简介 名称由来&#xff1a;Tomcat最初是由 Sun的软件构架师詹姆斯邓肯戴维森开发的&#xff0c;后来他帮助将其变 为开源项目&#xff0c;并由Sun贡献给Apache软件基金会&#xff0c;由于大部分开源项目OReilly都会出一本相关的 书&#xff0c;并且将其封面设计成某个动物…

深度解析JVM类加载器与双亲委派模型

概述 Java虚拟机&#xff08;JVM&#xff09;是Java程序运行的核心&#xff0c;其中类加载器和双亲委派模型是JVM的重要组成部分。本文将深入讨论这两个概念&#xff0c;并解释它们在实际开发中的应用。 1. 什么是类加载器&#xff1f; 类加载器是JVM的一部分&#xff0c;负…

如何使用“通义听悟”提高工作和学习效率

如何使用通义听悟提高工作和学习效率 通义听悟是一款利用人工智能技术&#xff0c;自动为音频和视频内容提供转写、翻译、总结、检索等功能的在线工具。它可以在会议、学习、访谈、培训等场景下&#xff0c;帮助您记录、阅读、整理、复习音视频信息&#xff0c;成为您的工作和…

七、Qt 信号和槽

在QT4以上的版本&#xff0c;在窗体上用可以通过选中控件&#xff0c;然后点击鼠标右键单击按钮&#xff0c;选择“转到槽”。可以自动创建信号和槽。 选择clicked(),并点击 ok Qt Creator会给头文件和代码文件自动添加 这个按钮的单击事件&#xff08;信号和槽&#xff09;。 …

智谱推出新一代基座大模型GLM-4

今天智谱推出新一代基座大模型GLM-4。 GLM-4 新一代基座大模型GLM-4&#xff0c;整体性能相比GLM3全面提升60%&#xff0c;逼近GPT-4&#xff1b;支持更长上下文&#xff1b;更强的多模态&#xff1b;支持更快推理速度&#xff0c;更多并发&#xff0c;大大降低推理成本&…

Linux中放大字体

环境&#xff1a;VMware17Pro&#xff0c;Ubuntu22.04 在显示设置外观中只看到图标放大的调整&#xff0c;没看到字体大小设置 不按照常规设置&#xff0c;点开下面的辅助功能->大号文本&#xff08;没有设置具体字号的选项&#xff0c;但是可以放大&#xff09; 效果图如下…

基础面试题整理5

1.事务基本特性 A(原子性)&#xff1a;要么全部成功&#xff0c;要么全部失败&#xff1b;C(一致性)&#xff1a;程序设计要与业务逻辑相匹配&#xff1b;I(隔离性)&#xff1a;事务之间是互不干扰的&#xff1b;D(持久性)&#xff1a;事务提交后数据会存储到磁盘中&#xff1b…

建造者模式深入理解:演示建造单个和多个产品的实践,结合模板模式,通俗易懂

首先呢看下建造者的定义是什么样的&#xff0c;先读一遍 建造者模式 建造者模式&#xff08;Builder Pattern&#xff09;是一种创建型设计模式&#xff0c;它主要用于将一个复杂对象的构建过程与它的表示分离&#xff0c;使得同样的构建过程可以创建不同的表现形式。这种模式…

圈小猫游戏HTML源码

源码介绍 圈小猫游戏html源码&#xff0c;HTMLCSSJS,记事本可以打开修改内容&#xff0c;电脑本地双击index.html即可运行&#xff0c;也可以上传到服务器上面运行&#xff0c;喜欢的同学可以拿去使用 下载地址 蓝奏云&#xff1a;https://wfr.lanzout.com/iFkVc1lb5akj CS…

pytorch一致数据增强—独用增强

前作 [1] 介绍了一种用 pytorch 模仿 MONAI 实现多幅图&#xff08;如&#xff1a;image 与 label&#xff09;同用 random seed 保证一致变换的写法&#xff0c;核心是 MultiCompose 类和 to_multi 包装函数。不过 [1] 没考虑各图用不同 augmentation 的情况&#xff0c;如&am…

【C++】- 类和对象(构造函数!!explicit关键字stastic关键字!!详解)

类和对象④ 构造函数初始化列表explicit关键字static成员 构造函数初始化列表 我们已经初步了解了构造函数------->类和对象②那么调用构造函数就是给了对象中各个成员变量一个合适的初始值。 但实际上&#xff0c;我们想要做的是初始化成员变量&#xff0c;在构造函数中对…

新手学习指南:用Scala采集外卖平台

学习爬虫不是一蹴而就的&#xff0c;在掌握相关的知识点的同时&#xff0c;还要多加练习&#xff0c;学习是一部分&#xff0c;更多的还是需要自己上手操作&#xff0c;这里配合自己学习的基础&#xff0c;以及使用一些爬虫的专有库&#xff0c;就可以轻松达到自己想要的数据。…

Angular系列教程之自定义指令

文章目录 前言指令的基本概念在模板中使用指令总结 前言 在Angular中&#xff0c;指令是一种非常强大的工具&#xff0c;用于扩展HTML元素的功能和行为。它们允许我们创建可重用的组件&#xff0c;并在应用程序中的多个地方使用它们。本文将介绍Angular指令的基础知识&#xf…
最新文章