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 p5int 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.mzph.cn/news/623260.shtml

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

相关文章

基于嵌入式AI的ROI区域视频传输系统设计与实现

在当今快速发展的智能监控领域&#xff0c;实现高效的视频流处理和传输成为了一项重要挑战。本文介绍了一个基于嵌入式AI平台的视频传输系统设计&#xff0c;该系统能够识别视频中的关键区域&#xff08;ROI&#xff09;&#xff0c;并对这些区域进行高效的编码处理。特别地&am…

Python数据的处理

一.字符串拼接的几种方式 使用str.join()方法进行拼接字符串直接拼接使用格式化字符串进行拼接 ​ s1hello s2world #(1)使用➕进行拼接 print(s1s2) #(2)使用字符串的join&#xff08;&#xff09;方式 print(.join([s1,s2])) print(*.join([s1,s2])) print(你好.join([s1,s…

neus2安装运行纪实

./build/testbed --scene transforms.json

Python操作MySQL入门教程,使用pymysql操作MySQL,有录播直播私教课

创建数据库 create database gx character set utf8mb4;连接数据库 #!/usr/bin/python3import mysql as pymysql# 打开数据库连接 db pymysql.connect(hostlocalhost,port3306,userroot,passwordzhangdapeng520,databasegx)# 使用 cursor() 方法创建一个游标对象 cursor cur…

【MATLAB随笔】GUI编程(未完结)

文章目录 一、创建图窗1.1 figure 函数详解1.11 窗口标识1.12 窗口外观1.13 位置和大小 二、xxx 一、创建图窗 跟很多GUI编程一样的&#xff0c;先创建一个基本的图窗&#xff0c;然后再添加按钮、文章、标签&#xff0c;绑定函数等等&#xff0c;比如python的tkinter。 MATL…

C/C++算法从小白到高手(1):排序算法

1. 冒泡排序 (1) 基本思路 冒泡排序是一种简单的、但效率极低的排序算法&#xff0c;基本思路是重复地遍历待排序的序列&#xff0c;通过相邻元素的比较和交换&#xff0c;将较大&#xff08;或较小&#xff09;的元素逐步"冒泡"到右侧&#xff08;或左侧&#xff0…

文章解读与仿真程序复现思路——电网技术EI\CSCD\北大核心《考虑风电出力不确定性的电网无功-电压控制鲁棒分区方法》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 这个标题涉及到考虑风电出力不确定性的电网无功-电压控制鲁棒分区方法。让我们逐步解读这个标题的主要关键词和概念&#xff1a; 考虑风电出力不确定性…

android,app,小程序页面布局的各种栏

手机页面从上到下通常包含以下几个栏&#xff1a; 1.状态栏&#xff08;Status Bar&#xff09;&#xff1a;位于屏幕的顶部&#xff0c;用于显示手机的系统状态信息&#xff0c;例如时间、电池电量、信号强度等。状态栏也可以包含一些通知图标和快捷设置图标。 2.标题栏&…

根据编码规则使用nodejs脚本来大批量生成星原物联网设备采集点表

在使用星原网关时&#xff0c;需要导入点表&#xff0c;由于设备的点表非常的多&#xff0c;可写的点表有1095个。 所有根据编码规律&#xff0c;编写了一段nodejs代码&#xff0c;来生成点表。 一个编码有四部分组成&#xff0c; 分别是 [‘A’, ‘B’, ‘C’, ‘D’, ‘E’]…

CTF伪随机数爆破

要了解伪随机数的爆破首先你的先知道什么是PHP种子&#xff0c; 借用在rand()函数中&#xff0c;我们可以通过设置随机数种子来影响随机数的生成。例如&#xff0c;在rand()函数中加入了随机数种子编码后&#xff0c;每次运行程序将会生成同样的随机整数序列。这个就是伪随机数…

第28关 k8s监控实战之Prometheus(八)

大家好&#xff0c;我是博哥爱运维。从这节课开始&#xff0c;博哥计划引入golang&#xff08;简称go&#xff09;语言开发的一些内容&#xff0c;没有接触过go语言的同学也不用慌&#xff0c;我会尽量以一个新人的角度&#xff0c;去把这些go开发的内容讲得通俗一些。这节课还…

布隆过滤器四种实现(Java,Guava,hutool,Redisson)

1.背景 为预防大量黑客故意发起非法的时间查询请求&#xff0c;造成缓存击穿&#xff0c;建议采用布隆过滤器的方法解决。布隆过滤器通过一个很长的二进制向量和一系列随机映射函数&#xff08;哈希函数&#xff09;来记录与识别某个数据是否在一个集合中。如果数据不在集合中…

计算机毕业设计 基于Java的国产动漫网站的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

polar CTF 写shell

一、题目 <?php /*PolarD&N CTF*/highlight_file(__FILE__);file_put_contents($_GET[filename],"<?php exit();".$_POST[content]);?>二、解题 payload ?filenamephp://filter/convert.base64-decode/resourceshell.php #<?eval($_POST[1]);…

Hadoop 实战 | 词频统计WordCount

词频统计 通过分析大量文本数据中的词频&#xff0c;可以识别常见词汇和短语&#xff0c;从而抽取文本的关键信息和概要&#xff0c;有助于识别文本中频繁出现的关键词&#xff0c;这对于理解文本内容和主题非常关键。同时&#xff0c;通过分析词在文本中的相对频率&#xff0…

Echarts折线图中数据根据正负数显示不同区域背景色-配置

示例 Echarts折线图中数据根据正负数显示不同区域背景色 Piecewise 分段类型Continuous 连续类型 Echarts配置 option {backgroundColor: "#030A41",xAxis: {type: category,data: [Mon, Tue, Wed, Thu, Fri, Sat, Sun],axisTick: {show: false,},axisLabel: { /…

x-cmd pkg | jless - 受 Vim 启发的命令行 JSON 查看器

目录 简介首次用户功能特点类似工具与竞品进一步探索 简介 jless 是一个命令行 JSON 查看器&#xff0c;设计用于读取、探索和搜索 JSON 数据。可以使用它来替代 less 、 jq 、 cat 以及您当前用于查看 JSON 文件的编辑器的任何组合。它是用 Rust 编写的&#xff0c;可以作为单…

DNS记录类型介绍(A记录、MX记录、NS记录等)

简介&#xff1a; DNS A记录 NS记录 MX记录 CNAME记录 TXT记录 TTL值 PTR值建站名词解释&#xff1a;DNS A记录 NS记录 MX记录 CNAME记录 TXT记录 TTL值 PTR值 泛域名 泛解析 域名绑定 域名转向 1.DNS&#xff1a;Domain Name System 域名管理系统 域名是由圆点分开一串单词或缩…

启动SpringBoot报错:No more pattern data allowed after {*...} or ** pattern element

报错信息 [AbstractApplicationContext.java:592] → [Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name viewControllerHandlerMapping defin…

C#属性(Property)

文章目录 一、C#属性&#xff08;Property&#xff09;&#xff1f;二、属性的用法总结 一、C#属性&#xff08;Property&#xff09;&#xff1f; C#属性&#xff08;Property&#xff09;是一种访问器&#xff08;accessor&#xff09;&#xff0c;用于封装一个类的字段&…