改进的最大内切圆算法求裂缝轮廓宽度

这篇具有很好参考价值的文章主要介绍了改进的最大内切圆算法求裂缝轮廓宽度。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前段时间我将网上最大内切圆算法进行了代码的整理,原先博主上传的代码稍微有点乱,可能也是它自己使用,大家可以看这篇整理好的:最大内切圆算法计算裂缝宽度。

最大内切圆算法详解

一个圆与给定的多边形或曲线的每一条边或曲线都相切的圆。而我们就是需要计算的是给定图像的轮廓的最大内切圆,也就是与轮廓的每一条边都相切的圆中直径最大的圆。这样直径就是我们的轮廓的宽度了。

既然要求轮廓的内接圆,从圆的特点来说,想要唯一的确定一个圆,就是要知道它的圆心和半径。好的,那现在的问题就从求取轮廓的内接圆,巧妙地转变成求取某个点和一个多边形的距离和关系。

在opencv中有一个函数pointPolygonTest就是能够得到某个点和某个多边形之间的关系,例如这个点是在多边形内部、外部、或者是在多边形上,还能得到该点距离多边形的像素距离。那问题其实就很好解决了。我们再使用cv2.minMaxLoc(src)来获得给定的数组中寻找最小值和最大值的位置,它的语法如下

min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(src)

其中,src是输入的数组或图像。函数会返回最小值min_val和最大值max_val,以及它们在数组中的位置最小值的位置min_loc和最大值的位置max_loc。 

讲到这里我想大家也知道怎么求轮廓的宽度了吧,即为:max_loc * 2。

详细代码

import cv2
import string
import numpy as np
import pyzjr as pz

def incircle(img, contours_arr, color=(0, 0, 255)):
    """
    轮廓最大内切圆算法,所有轮廓当中的内切圆
    """
    result = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR)
    raw_dist = np.zeros(img.shape, dtype=np.float32)
    letters = list(string.ascii_uppercase)
    label = {}
    for k, contours in enumerate(contours_arr):
        for i in range(img.shape[0]):
            for j in range(img.shape[1]):
                raw_dist[i, j] = cv2.pointPolygonTest(contours, (j, i), True)
        min_val, max_val, _, max_dist_pt = cv2.minMaxLoc(raw_dist)
        label[letters[k]] = max_val * 2
        radius = int(max_val)
        cv2.circle(result, max_dist_pt, radius, color, 1, 1, 0)

    return result, label


if __name__=="__main__":
    path = r"D:\PythonProject\RoadCrack\dimension2_data\num/001.png"
    img = cv2.imread(path)
    gray_img = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    thresh = pz.BinaryImg(img)
    contours_arr, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)

    result, label = incircle(gray_img, contours_arr)
    print("裂缝宽度:",label)
    cv2.imwrite("result.png",result)

先检测轮廓,你可以使用opencv的findContours。需要确保是ndarray数组的形式。

裂缝宽度: {'A': 5.656854152679443, 'B': 4.4721360206604}

改进的最大内切圆算法求裂缝轮廓宽度,二维检测,算法,opencv

现在我们就能知道两条裂缝对应的最大内切圆直径,即裂缝的宽度。

算法对比

并且从时间角度来看:

  • 原先的最大内切圆算法: 1.79125 sec
  • 改进后的内切圆算法:  1.05487 sec

从计算的直径上来看:

  • 原先的最大内切圆算法:13.81
  • 改进后的内切圆算法:{'A': 14.0}

这里的实现比较简单,只是嵌套的循环比较多,但能存储每条裂缝对应的宽度。文章来源地址https://www.toymoban.com/news/detail-730674.html


2023/10/22更新
# pip install pyzjr==1.2.5
import cv2
import pyzjr as pz
from pyzjr.augmentation import incircle

if __name__=="__main__":
    path = r"D:\PythonProject\RoadCrack\dimension2_data\num/001.png"
    img = cv2.imread(path)
    gray_img = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    thresh = pz.BinaryImg(img)
    contours_arr, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)

    result, label = incircle(gray_img, contours_arr)
    print("裂缝宽度:",label)
    cv2.imwrite("result.png",result)

到了这里,关于改进的最大内切圆算法求裂缝轮廓宽度的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • OpenCV(三十四):轮廓外接最大、最小矩形和多边形拟合

    目录 1.轮廓外接最大矩形boundingRect() 2.轮廓外接最小矩形minAreaRect() 3.轮廓外接多边形approxPolyDP() 1.轮廓外接最大矩形boundingRect() Rect cv::boundingRect ( InputArray array ) array:输入的灰度图像或者2D点集,数据类型为vectorPoint或者Mat。 示例代码:  轮廓外接最大矩形的结果: 2.轮廓外接

    2024年02月09日
    浏览(63)
  • 改进的KMeans 点云聚类算法 根据体元中的点数量计算点密度,并获取前K个点密度最大的体元作为初始聚类中心(附 matlab 代码)

    KMeans函数的主要逻辑如下: 使用InitCenter函数初始化聚类中心,该函数根据体元密度选择初始聚类中心。该函数的输入参数包括数据(data)、聚类中心数量(centerNum)和体元数量(voxelNum)。 根据点云的取值范围计算包围盒的体积(V)和体元边长(d)。 根据体元边长将点云

    2024年02月10日
    浏览(28)
  • 【毕业设计】基于深度学习的道路裂缝识别算法系统 python 卷积神经网络 人工智能

    目录  前言 设计思路 一、课题背景与意义 二、算法理论原理 2.1 卷积神经网络 2.1 YOLOv5算法 三、道路裂缝检测的实现 3.1 数据集 3.2 实验环境及参数设置  3.2 实验及结果分析 实现效果图样例 最后        📅大四是整个大学期间最忙碌的时光,一边要忙着备考或实习为毕业后

    2024年03月24日
    浏览(79)
  • 【前端可视化】postcss-px-to-viewport 适配怎么限制最大宽度?使用 postcss-mobile-forever

    自己用 nuxt3 写官网发现用 postcss-px-to-viewport 这个插件虽然能够实现基于 vw 的响应式,但是无法做到限制宽度,比如设计稿 1920p,我只想让最大缩放比例为 1920p,不能超过,就无法实现了。 纯 css 的话,有两个办法,一种用 px 生成两套代码,一套移动端的 vw 视图,一套最大宽

    2024年01月24日
    浏览(40)
  • 【CSS 08】display 控制布局 块级元素 行内元素 隐藏元素 结合JS 最大宽度 浏览器窗口 定位 position z-index 堆叠

    说在前面 CSS基础教程系列已经结束,接下来就是中级教程,让我们跟上脚步,继续努力吧! 并且最近临近期末考试,后面十天休刊… display display 属性是用于控制布局的最重要的 CSS 属性 display 属性规定是否/如何显示元素 隐藏元素 - display:none 还是 visibility:hidden 通过将 disp

    2024年02月08日
    浏览(57)
  • Python——Kmeans聚类算法、轮廓系数(算法理论、代码)

    目录 1 Kmeans模型理论 1.1 K-均值算法(K-means)算法概述 1.2 距离度量 1.3 K-means算法流程 1.4 K值的选择 1.5 K-means的优点 1.6 K-means的缺点 1.7 聚类的评价指标 2 代码解释 3 实操  3.1 构建聚类数目为3的KMeans模型 3.2 占比饼图 3.3 轮廓系数值 3.4 使用for循环计算聚类个数为2至9时的轮廓

    2024年02月01日
    浏览(51)
  • 算法:BFS宽度优先遍历

    本篇总结的是BFS算法,BFS算法相比起DFS算法来说还是比较简单的 这里提供一种双端队列的做法,也可以在合适的层数逆序

    2024年02月21日
    浏览(51)
  • 宽度优先搜索算法(BFS)

    宽度优先搜索算法(BFS) (也称为 广度优先搜索 )主要运用于树、图和矩阵(这三种可以都归类在图中),用于在图中从起始顶点开始 逐层 地向外探索,直到找到目标顶点为止。 在本篇文章中,我们主要讨论其在 树 中的运用 树的宽度优先搜索 即 树的层序遍历 :逐层访

    2024年03月12日
    浏览(46)
  • WPF 笔迹算法 从点集转笔迹轮廓

    本文将告诉大家一些笔迹算法,从用户输入的点集,即鼠标轨迹点或触摸轨迹点等,转换为一个可在界面绘制显示笔迹画面的基础数学算法。尽管本文标记的是 WPF 的笔迹算法,然而实际上本文更侧重基础数学计算,理论上可以适用于任何能够支持几何绘制的 UI 框架上,包括

    2024年02月08日
    浏览(36)
  • 墙地砖外形检测的技术方案-外部轮廓检测算法

    Ramer算法 利用Canny算子得到墙地砖轮廓后,必须进一步将轮廓线精确分段成墙地砖的四条边,从而可得到墙地砖轮廓尺寸、边直度和直角度指标。采用如下算法实现: 第1,选择较高阈值,利用ramer算法将轮廓线用多边形(Polygon)近似。 第2,如果多个轮廓直线段能被圆弧近似

    2024年01月18日
    浏览(56)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包