八邻域断点检测

2023-11-08

八邻域断点检测


    本文的理论思想主要来源大家可以参照,迈克老狼2012:OpenCV学习(13) 细化算法(1) 。本文是我自己尝试着将八邻域的细化思想

运用到断点检测上,个人觉得其实仅仅是八邻域应用的一小方面大家可以尝试着往其他方面应用。其实相对于八邻域的细化思想,断

点检测其实更加简单。这里简单给大家介绍一下:

                                                                                                       

很简单大家看到以P1为中心的它的八个领域,如果 p2+p3+p4+p5+p6+p7+p8+p9小于等于6保证p1点是一个边界点,大于6则是一个内部点;等于0时候,周围没有等于1的像素,所以p1为孤立点;等于1的时候,周围只有1个灰度等于1的像素,所以是端点。

                                        

而我们的断点检测就是需要检测图像的端点,当然大家也可以根据这个检测图像中的孤立点或者其他。我这里仅以端点检测为例。

#include "opencv2/opencv.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"
#include <iostream>
using namespace cv;
using namespace std;
void breakImage(IplImage* src, IplImage* dst, int maxIterations = -1);
CvPoint2D32f center;
float  x, y;
int main(int argc, char* argv[])
{
	//传入一个灰度图像
	IplImage* pSrc = cvLoadImage("C:\\Users\\w\\Desktop\\学习资料\\outP2.jpg", 0);
	int n = 0, m = 0;
	IplImage* pTmp = cvCloneImage(pSrc);
	IplImage*pDst = cvCreateImage(cvGetSize(pSrc), 8, 1);
	cvZero(pDst);
	cvThreshold(pSrc, pTmp, 125, 1,1/*CV_THRESH_BINARY_INV*/);//做二值处理,将图像转换成0,1格式	
	cvShowImage("2", pDst);
	breakImage(pTmp, pDst, 8);//调用断点检测函数
	cvThreshold(pDst, pDst, 0.5, 255, CV_THRESH_BINARY);//做二值处理,将图像转换成0,1格式
	cvNamedWindow("src", 1);
	cvNamedWindow("dst", 1);
	cvShowImage("src", pSrc);
	cvShowImage("dst", pDst);
	cvSaveImage("outP.jpg", pDst);
        cvWaitKey(0);
	cvReleaseImage(&pSrc);
	cvReleaseImage(&pDst);
	cvReleaseImage(&pTmp);
	cvDestroyWindow("src");
	cvDestroyWindow("dst");
	return 0;
}

void breakImage(IplImage* src, IplImage* dst, int maxIterations)
{
   int xypiont [10000][2];
    int num=0;
	CvSize size = cvGetSize(src);
	cvCopy(src, dst);//将src中的内容拷贝到dst中    
	int count = 0;  //记录迭代次数    
	while (true)
	{
		count++;
		if (maxIterations != -1 && count > maxIterations) //限制次数并且迭代次数到达    
			break;
		for (int i = 0; i < size.height; ++i)
		{
			for (int j = 0; j < size.width;++ j)
			{  
				//  p9 p2 p3    
				//  p8 p1 p4    
				//  p7 p6 p5    
				int p1 = CV_IMAGE_ELEM(dst, uchar, i, j);
				if (p1 != 1) continue;
				int p2 = (i == 0) ? 0 : CV_IMAGE_ELEM(dst, uchar, i - 1, j);
				int p3 = (i == 0 || j == size.width - 1) ?0 : CV_IMAGE_ELEM(dst, uchar, i - 1, j + 1);
				int p4 = (j == size.width - 1) ? 0 : CV_IMAGE_ELEM(dst, uchar, i, j + 1);
				int p5 = (i == size.height - 1 || j == size.width - 1) ? 0 : CV_IMAGE_ELEM(dst, uchar, i + 1, j + 1)
		         	int p6 = (i == size.height - 1) ? 0 : CV_IMAGE_ELEM(dst, uchar, i + 1, j);
				int p7 = (i == size.height - 1 || j == 1) ?0 : CV_IMAGE_ELEM(dst, uchar, i + 1, j - 1);
				int p8 = (j == 0) ? 0 : CV_IMAGE_ELEM(dst, uchar, i, j - 1);
				int p9 = (i == 0 || j == 0) ?0 : CV_IMAGE_ELEM(dst, uchar, i - 1, j - 1);

				if (p1 ==1)
				{
					if (( p2 + p3 + p4 + p5 + p6 + p7 + p8 + p9)==1)

					{	
						cout << "(y,x):" << "(" << i << "," << j << ")"<<"\n";
						xypiont[num][0] = j;
						xypiont[num][1] = i;
						num++;
					}
				}	
			}
		}
	}
		for (int k=0; k < num; k++)
		{

		center.y=xypiont[k][1];
		center.x = xypiont[k][0];		
		cvCircle(dst, cvPointFrom32f(center), 15, cvScalar(155, 0, 0));
		}
		cvShowImage("dst", dst);
		cvSaveImage("dsc_c.jpg", dst);
	cout << "次数:" << count << "\n";

}
这个例子我对断点进行了标记,画出了以断点为圆心的小圆,圆的半径自己去决定就好。在这里需要强调的是,输入的图像必须要进行二值化,因为我们的理论思想就是像素点的值是0或1的;而且前提是将图像进行细化,这样结果会更加准确。本文输入的图像是我进行了轮廓的提取以及细化操作之后的;至于轮廓提取和细化的程序大家在网上搜索有很多的。由于我输入图像的问题所以我进行了两次二值化处理,具体的大家根据自己的输入情况定吧。

由于我的操作的图像较大,所以截取了部分区域,给他家看一下结果。

最初的原始图像:

                                      

下图是我进行轮廓提取以及细化操作后输出的图像也是我进行断点检测输入:

                                                                                                   

最后是我运行结果图: 

                                                                 


代码的书写格式可能会有存在写问题,请大家见谅。自己也是初学者在代码编写中也遇到了许多问题,比如本文中的二值化的问题,我想仅进行一次二值化,但是总是出现问题,现在也没搞明白哪里的原因。希望和大家相互交流相互进步。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

八邻域断点检测 的相关文章

  • 深度学习图像处理之VGG网络模型 (超级详细)

    VGG介绍 由牛津大学著名研究所VGG提出 斩获该年ImageNet竞赛中Localization Task 定位任务 第一名和Classification Task 分类任务 第二名 VGG网络的配置 VGG 16是许多模型中的主干网络
  • 图像的二值化分割,otsu类间方差法

    二值化图像指图像中的每个像素只取两个离散的值之一 用数学公式表示为 公式中 f x y 表示一幅数字图像 X Y表示该图像中某像素的坐标值 T为 二值化的阈值 表示经过阈值运算后的二值化图像 这里0和1仅仅是一个抽象表示 并非实际像素值 它
  • 期望, 方差, 协方差,标准差

    期望 方差 协方差 标准差 期望 概率论中描述一个随机事件中的随机变量的平均值的大小可以用数学期望这个概念 数学期望的定义是实验中可能的结果的概率乘以其结果的总和 定义 设P x 是一个离散概率分布 自变量的取值范围为 x 1 x 2 x
  • windows8.1 vs2015 dlib库cpu 版本编译以及应用 library is 90, caller expects 80

    近期由于要做一个关于人脸计数的项目 因此对dlib库进行了编译和使用 其中遇到了不少问题 下面请听我一一道来 第一步 从dlib官网下载dlib源码 链接地址 https github com davisking dlib 第二步 采用cm
  • matlab中 hold on 与 hold off,figure作用

    hold on是当前轴及图像保持而不被刷新 准备接受此后将绘制的图形 多图共存 即启动图形保持功能 当前坐标轴和图形都将保持 从此绘制的图形都将添加在这个图形的基础上 并自动调整坐标轴的范围 hold off使当前轴及图像不再具备被刷新的性
  • mingw qt5.14.2 编译 vtk9.1.0

    1 软件 qt版本 qt opensource windows x86 5 14 2 exe 安装mingw选项 cmake版本 cmake 3 21 2 windows x86 64 msi VTK源码版本 VTK 9 1 0 tar g
  • 第五章-数字水印-1-位平面

    数字水印概念 数字水印是一种将特定数字信息嵌入到数字作品中从而实现信息隐藏 版权认证 完整性认证 数字签名等功能的技术 以图片水印为例 水印嵌入过程 版权信息水印A嵌入到图像B中 得到含有水印的图像C 图像C与图像B在外观上基本一致 肉眼无
  • python批量处理

    python opencv图像二值化批量处理 from skimage import data dir io transform color filters import numpy as np import cv2 def convert
  • Halcon模板匹配

    Halcon模板匹配 Halcon模板匹配的方法 模板匹配的流程 基于形状的模板匹配的思路 原理 Halcon模板匹配的方法 模板匹配的流程 基于形状的模板匹配的思路 读取图像 转灰度图 dev close window dev open
  • 基于Matlab实现图像拼接技术(附上完整源码+图像)

    图像拼接是数字图像处理中一个重要的问题 它的目标是将多张图像拼接成一张更大的图像 图像拼接技术在许多领域中都有广泛的应用 如全景图像拼接 医学图像拼接 遥感图像拼接等 本文将介绍一种基于Matlab实现的图像拼接技术 即基于特征匹配的图像拼
  • 最大似然估计【MLE】与最大后验概率【MAP】

    最大似然估计 Maximum likelihood estimation 简称MLE 和最大后验概率估计 Maximum a posteriori estimation 简称MAP 是很常用的两种参数估计方法 如果不理解这两种方法的思路 很
  • 深度特征融合---高低层(多尺度)特征融合

    目录 概述 基本概念 典型方法概述 相关工作 多尺度模型设计 Deep Feature Fusion for VHR 高分辨率图像 Remote Sensing Scene Classification DCA特征融合方法 基于神经网络的目
  • SeetaFace编译成功(有windows及Android源码)

    声明 由于本人水平有限 所提供的代码 dll so等必然存在很多问题 仅用于学习 不适合工业级使用 请谨慎使用 如果造成损失 责任自负 对齐 这张照片第3个人的特征点检测有点问题 研发人员很快修正了 赞一个 下面是人脸比对 准确率还是可以接
  • PR-RL:Portrait Relighting via Deep Reinforcement Learning

    文章目录 Title PR RL Portrait Relighting via Deep Reinforcement Learning 1 Article 1 1 Abstract and Introduction 1 2 Conclus
  • Edraw Max教程】如何有趣的创建梦幻般的思维导图

    Edraw Max 亿图图示 是一款综合图形图表制作软件 它包含丰富的实例和模版 帮助您轻松创建流程图 网络拓扑图 组织结构图 商业图表 工程图 思维导图 软件设计图和平面布局图等 亿图采用更智能和人性化的绘制方式 最大程度帮助设计者降低工
  • 目标检测YOLO系列从入门到精通技术详解100篇-【图像处理】图像分类

    目录 前言 知识储备 图像分类基础知识 1 具体领域划分 2 图像分类问题的3层境界
  • Matlab图像处理系列——图像复原之噪声模型仿真

    微信公众号上线 搜索公众号 小灰灰的FPGA 关注可获取相关源码 定期更新有关FPGA的项目以及开源项目源码 包括但不限于各类检测芯片驱动 低速接口驱动 高速接口驱动 数据信号处理 图像处理以及AXI总线等 本节目录 一 图像复原的模型 二
  • 友思特分享 | CamSim相机模拟器:极大加速图像处理开发与验证过程

    来源 友思特 机器视觉与光电 友思特分享 CamSim相机模拟器 极大加速图像处理开发与验证过程 原文链接 https mp weixin qq com s IED7Y6R8WE4HmnTiRY8lvg 欢迎关注虹科 为您提供最新资讯 随着
  • 图像分割-Grabcut法

    版权声明 本文为博主原创文章 转载请在显著位置标明本文出处以及作者网名 未经作者允许不得用于商业目的 本文的C 版本请访问 图像分割 Grabcut法 C CSDN博客 GrabCut是一种基于图像分割的技术 它可以用于将图像中的前景和背景
  • 盘点那些年我们一起玩过的网络安全工具

    大家好 我是IT共享者 这篇文章给大家盘点那些年 我们一起玩过的网络安全工具 一 反恶意代码软件 1 Malwarebytes 这是一个检测和删除恶意的软件 包括蠕虫 后门 流氓 拨号器 间谍软件等等 快如闪电的扫描速度 具有隔离功能 并让

随机推荐

  • 【Python爬虫与数据分析】爬虫代理IP与访问控制

    目录 一 代理IP 二 正则表达式re 三 通过代理IP对网站循环访问 四 通过selenium工具实现访问控制 注 文末有干货 不过不认真看完你可学不懂 偷笑 一 代理IP 在爬虫对服务器做资源请求时 通常情况是不需要用到代理IP的 但是
  • DBC文件的编辑方法

    1 启动candb 程序 File gt createdatabase选择模板 然后保存dbc文件 2 添加网络节点 在OverallView界面 右击Network nodes选择New弹出如下界面 设置节点名称 把前面编辑好的Messa
  • 一键提升多媒体内容质量:漫谈图像超分辨率技术

    看的一篇图像超分辨推文 在这里记录一下 方便后续查阅 作为将模糊的图像变清晰的神奇技术 图像超分辨率技术在游戏 电影 相机 医疗影像等多个领域都有广泛的应用 在这篇文章中 微软亚洲研究院的研究员们为你总结了图像超分辨率问题中的主流方法 现存
  • html原生js进度条圆形,原生JS环形进度条

    var bg document getElementById canvas1 var ctx bg getContext 2d ctx beginPath ctx lineWidth 10 ctx strokeStyle e5e5e5 va
  • jquery checkbox 设置选中和不选中

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 设置选中 hasApply prop checked true 设置不选中 hasApply prop checked false 获取选中的状态 var status h
  • Active Directory的基本概念

    前言 本文是面对准备加入Active Directory编程的初学者的一份文章 主要是讲解Active Directory 活动目录 的一些概念和相关知识 这篇文章本来是不想写下来的 因为概念性内容的编写需要查阅很多的资料 也怕自己讲的不够
  • 计算机无法识别华为m3,华为M3平板怎么开启学生模式过滤不良网站?

    对于孩子使用电子设备这件事儿 家长们总会陷入到一种矛盾中 即 支持用吧 但是现如今信息复杂 孩子没有自控力 不能每天都盯着 监督不慎误入歧途怎么办 支持不用吧 但是上面又有很多资料资源 值得孩子们去学习 视频教学 益智科普类的软件层出不穷
  • layout_weight 标签用于在线性布局中指定父控件的剩余空间比例的分配

    layout weight 用于在线性布局中指定父控件的剩余空间比例的分配
  • 数学建模竞赛论文中的Word使用

    1 使用样式 除了Word原先所提供的标题 正文等样式外 还可以自定义样式 如果你发现自己是用选中文字然后用格式栏来设定格式的 一定要注意 想想其他地方是否需要相同的格式 如果是的话 最好就定义一个样式 对于相同排版表现的内容一定要坚持使用
  • 如何配置Vue脚手架(Vue CLI)

    第一步 用cmd打开命令提示符 输入命令行 npm config set registry https registry npm taobao org 第二步 打开cmd 输入命令行 npm install g vue cli 中途可能会出
  • MATLAB/simulink时域分析之性能指标(0基础)

    目录 6 时域分析 6 1 性能指标 6 1 1 典型输入信号 6 1 2 一阶系统时域响应 6 1 3 二阶系统时域响应 6 1 4 二阶系统的改善 6 时域分析 由于多数控制系统是以时间作为独立变量 所以人们往往关心输出对时间的响应 对
  • 刷脸支付创新高效促进消费者重新光临

    刷脸支付成为了移动金融产业新的焦点 这离不开代理的卖力推广 刷脸支付代理成为大多创业者的选择 从今往后 脸就是钱包走人寻常百姓家 再也不用担心发生突发情况 尴尬放回商品的局面 现在可以在便利店 部分夫妻店看见这样的画面 收银台不见了 换成了
  • python源码保护之cython

    转载请注明出处 准备 项目需要 是在windows7上操作 python3 7 针对python项目 而非单个的python程序 思路 先将py代码转成c代码 然后编译成pyd window上是pyd linux上是so 文件 安装cyth
  • base64转图片

    base64转图片 param base64Code base64码 public static void convertBase64ToImage String base64Code BufferedImage image byte im
  • Qt绘图与信号事件

    Qt应用开发的基本模式 面向对象 继承QDailog gkdialog h ifndef GK DIALOG H define GK DIALOG H include
  • 我的第一个python爬虫

    文章目录 前言 一 python爬虫是什么 二 豆瓣电影TOP250排行榜信息爬取 1 发送请求 2 获取数据 3 解析数据 4 保存数据 总结 前言 今天想跟大家分享下我完成第一个python爬虫项目的过程 同时记录自己的 第一次 我的第
  • windows下dll文件的创建详细教程

    1 前言 dll文件是啥 就不作过多赘述了 现在直接教大家如何创建与使用dll文件 本文基于windows系统 使用的编译相关工具为visual studio 2019 2 创建dll 2 1 创建dll工程 首先打开visual stud
  • LaTex使用技巧20:LaTex修改公式的编号和最后一行对齐

    写论文发现公式编号的格式不对 要求是如果是多行的公式 公式编号和公式的最后一行对齐 我原来使用的是 equation 环境 begin equation begin aligned a b c c d end aligned end equ
  • Unity中相机拍照并保存下来脚本

    以下是一个示例的Unity拍照脚本 用于拍摄相机看到的内容并保存在工程根目录下 using System using UnityEngine using System IO public class CameraCapture MonoBe
  • 八邻域断点检测

    八邻域断点检测 本文的理论思想主要来源大家可以参照 迈克老狼2012 OpenCV学习 13 细化算法 1 本文是我自己尝试着将八邻域的细化思想 运用到断点检测上 个人觉得其实仅仅是八邻域应用的一小方面大家可以尝试着往其他方面应用 其实相对