opencv---曲线断点检测(八邻域断点检测)

2023-10-29


前言

该方法适用于激光照射的背景图像,没有交叉,仅限一条曲线断裂检测

原始图像

原始图像越干净、简单,检测效果越好
原始图像越干净、简单,检测效果越好
原始图像越干净、简单,检测效果越好
原始图像越干净、简单,检测效果越好
在这里插入图片描述

预处理(很重要)处理越好,检测越准确

在这里插入图片描述
在图像预处理这里,对图像的噪声处理越干净越好,因为如何对于噪声点没有处理干净,对于后面的断点检测会出现巨大的误差。

端点检测

在这里插入图片描述

断点检测

在这里插入图片描述

端点的坐标为:x:1381 y:273
端点的坐标为:x:37 y:281
端点的坐标为:x:1039 y:532
端点的坐标为:x:917 y:548
提取端点个数:4

最后根据端点的位置,排除收尾端点,在进行端点两两配对,找出断点位置

完整代码

import cv2
from skimage import morphology
import numpy as np

img0 = cv2.imread('./silie/4232.jpg', 1)   # 读取图片
img = cv2.cvtColor(img0, cv2.COLOR_BGR2GRAY)
_,img = cv2.threshold(img, 30, 255, cv2.THRESH_BINARY)  # 二值化处理

ess = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (2,8))
img = cv2.dilate(img, ess, iterations=1)  # 形态学膨胀

contours, _ = cv2.findContours(img, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

n = len(contours)  # 轮廓的个数
cv_contours = []
for contour in contours:
    area = cv2.contourArea(contour)
    if area <= 2000:# 筛选面积大于500的,小于500的全部变为255,
        cv_contours.append(contour)
cv2.fillPoly(img, cv_contours, (0, 0, 0)) # 多个多边形填充

img[img==255] = 1
skeleton0 = morphology.skeletonize(img)   # 骨架提取
skeleton = skeleton0.astype(np.uint8)*255
cv2.imshow('s',skeleton)

def breakImage(img):
    pointxy = list()
    img_size = img.shape  # height,width,passageway
    for i in range(1,img_size[0]-1):
        PX_PRE = img[i-1]
        PX_curr = img[i]
        PX_Next = img[i+1]
        for j in range(1,img_size[1]-1):
            p1 = PX_curr[j]
            if p1 != 255:
                continue
            p2 = PX_PRE[j]
            p3 = PX_PRE[j+1]
            p4 = PX_curr[j+1]
            p5 = PX_Next[j+1]
            p6 = PX_Next[j]
            p7 = PX_Next[j-1]
            p8 = PX_curr[j-1]
            p9 = PX_PRE[j-1]
            if p1 ==255:
                if (p2 + p3 + p4 + p5 + p6 + p7 + p8 + p9) == 255:
                    pointxy.append((j,i))
                    # pointy.append(i)

    return pointxy

pointxy = breakImage(skeleton)
pointxy = sorted(pointxy)
pointxy = pointxy[1:][:-1]

num = len(pointxy)
if num % 2 == 0:
    for i in range(int(num / 2)):
        cv2.rectangle(img0, pointxy[i * 2], pointxy[i * 2 + 1], (0, 255, 0), 2)
elif num % 2 == 1 and num != 1:
    for i in range(int(len(pointxy) / 2) - 1):
        cv2.rectangle(img0, pointxy[i * 2], pointxy[i * 2 + 1], (0, 255, 0), 2)
    cv2.rectangle(img0, pointxy[-3], pointxy[-1], (0, 255, 0), 2)

cv2.imwrite("skeleton.png", img0)        # 保存骨架提取后的图片
cv2.waitKey(0)

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
希望这篇文章对你有用!

谢谢点赞评论!

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

opencv---曲线断点检测(八邻域断点检测) 的相关文章

随机推荐

  • 解决network-manager中wired为unmanaged的问题

    我的Debian 7 1安装好时没有network manager 便下载安装了一个 但安装完后wired总显示为unmanaged 解决方法如下 打开 etc NetworkManager NetworkManager conf 将man
  • Android 属性动画(Property Animation) 完全解析 (上)

    转载请标明出处 http blog csdn net lmj623565791 article details 38067475 1 概述 Android提供了几种动画类型 View Animation Drawable Animation
  • matlab 转换为正整数_【MATLAB】专题1笔记 MATLAB基础知识

    视频课程参考 https www bilibili com video BV19J411W7Ta 数值问题 gt 求解算法 gt 程序实现 gt 结果分析 MATLAB 功能 数值计算 符号计算 图形绘制 程序流程绘制 工具箱 数值计算方法
  • 什么是哈希函数

    Hash函数译为哈希函数 又称散列函数 是把任意长度的输入 通过散列算法 变换成固定长度的输出 该输出的值称为散列值或消息摘要 简单来说就是一种将任意长度的输入消息压缩成某一固定长度的消息摘要的函数 它具备以下的性质 哈希函数所必须的性质
  • 《数据结构》_PTA_数据结构作业5:树和二叉树

    判断题 1 1 某二叉树的前序和中序遍历序列正好一样 则该二叉树中的任何结点一定都无右孩子 F 1 2 存在一棵总共有2016个结点的二叉树 其中有16个结点只有一个孩子 F 1 3 哈夫曼树中一定没有度为 1 的结点 T 1 4 一棵非空
  • jdk1.8接口

    在1 8版本之前 接口中的常量必须复制 且接口中的方法都是抽象方法 public interface Bird int a 这里会报错 因为常量必须赋值才行 int b 10 void shout1 这里报错 因为抽象方法没有方法体 voi
  • KMP算法最浅显理解

    角色 甲 abbaabbaaba 乙 abbaaba 乙对甲说 帮忙找一下我在你的哪个位置 甲从头开始与乙一一比较 发现第 7 个字符不匹配 要是在往常 甲会回退到自己的第 2 个字符 乙则回退到自己的开头 然后两人开始重新比较 这样的事情
  • 加密世界的价值捕获:谁是超级捕获者?

    来源 蓝狐笔记 麦田的收获者 梵高 加密世界还很早期 整个行业都还处于构建的初级阶段 在这种情况下 有哪些赛道正在捕获价值 捕获价值的量级有多大 蓝狐笔记简要梳理一下加密行业的整体价值捕获情况 从中窥见加密行业不同赛道的价值捕获现状 尤其是
  • Gradle史上最详细解析

    转自 http www cnblogs com wxishang1991 p 5532006 html 前言 对于Android工程师来说编译 打包等问题立即就成痛点了 一个APP有多个版本 Release版 Debug版 Test版 甚至
  • 计算机提示xinput1_4.dll丢失的解决方法,哪种更值得推荐

    最近我在使用某个游戏时遇到了一个问题 就是出现了xinput1 4 dll文件缺失的错误 这个错误让我无法正常启动游戏 让我感到非常困扰和沮丧 经过一番努力 我终于成功修复了这个问题 也总结了一些解决方法 大家可以对比一下哪种更值得推荐 x
  • react 属性验证与默认属性

    类组件属性验证与默认属性 通过static定义类的属性 属性验证可以引入模板自带的prop types来进行类型判断 当然你也可以自己写一个类型判断的方法 然后对类的propTypes属性进行类型编写 propTypes 这个属性名不可自定
  • 【AWS实验】 使用 Lake Formation 设置数据湖

    文章目录 实验概览 目标 实验环境 任务 1 探索实验环境 任务 1 1 在 S3 存储桶中创建文件夹 任务 1 2 加载 AWS Cloud9 IDE 任务 1 3 将数据复制到 S3 存储桶 任务 2 设置 AWS Lake Forma
  • jq的ajax里面的datagrid,详解jquery easyui之datagrid使用参考

    本文介绍了jquery easyui之datagrid使用 具体如下 创建datagrid 在页面上添加一个div或table标签 然后用jquery获取这个标签 并初始化一个datagrid 代码如下 页面上的div标签 js代码 mag
  • ES配置与使用

    一 单机版安装 地址 www elastic co 下载tar格式 或者复制链接 wget url下载 启动 bin elasticsearch 二 插件 解决页面问题 GitHub下载 elasticsearch head 需要node环
  • RISC-V新进展!deepin 成功适配VisionFive 2

    RISC V指令集是基于精简指令集计算 RISC 原理建立的开放指令集架构 ISA RISC V则是在指令集不断发展和成熟的基础上建立的全新指令 RISC V指令集完全开源 设计简单 拥有模块化的设计 完整的工具链 易于移植Unix系统 以
  • WebService+Rxjava

    最近公司有了个新项目 是之前有个项目需要迭代 由于这个项目比较老 所以用的是WebService的接口 我之前都是写的是restful的接口 没有接触过WebServiece 看到之前的代码我也有点闷逼 于是就花了几天去研究了下WebSer
  • 补码乘法,补码乘法计算详细解说

    1 补码与真值得转换公式 补码乘法因符号位参与运算 可以完成补码数的 直接 乘法 而不需要求补级 这种直接的方法排除了较慢的对2求补操作 因而大大加速了乘法过程 首先说明与直接的补码乘法相联系数学特征 对于计算补码数的数值来说 一种较好的表
  • CMake 学习笔记(子目录 续)

    这篇博客接着上篇 我们的目录结构和上一个例子完全相同 CMakeLists txt MathFunctions CMakeLists txt MathFunctions cxx MathFunctions h mysqrt cxx mysq
  • STM32的Bootloader实现和遇到的情况

    目录 0 概述 1 keil设置 2 IAP跳转函数 3 APP重定向中断向量表 3 1 标准库 3 2 HAL库 4 一些小问题 4 1 从IAP跳转到APP后运行异常 4 2 没有SCB gt VTOR设置中断向量表 0 概述 实际中通
  • opencv---曲线断点检测(八邻域断点检测)

    前言 该方法适用于激光照射的背景图像 没有交叉 仅限一条曲线断裂检测 原始图像 原始图像越干净 简单 检测效果越好 原始图像越干净 简单 检测效果越好 原始图像越干净 简单 检测效果越好 原始图像越干净 简单 检测效果越好 预处理 很重要