最大内切圆算法计算裂缝宽度

本文这里是对CSDN上另一位博主的代码进行了整理:

基于opencv的裂缝宽度检测算法(计算轮廓最大内切圆算法)

我觉得这位博主应该是上传了一个代码草稿,我对其进行了重新整理,并添加了详细的注释。

import cv2
import math
import random
import numpy as np
from numpy.ma import cos, sin
import pyzjr as pzclass Maximum_width:def findContous(self,img):kernel = np.ones((1, 5), np.uint8)thresh=pz.BinaryImg(img)thresh = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel, anchor=(2, 0), iterations=5)contous, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)return contousdef Extract_repeat_points(self,contour,Bbox):"""从给定多边形轮廓内提取位于矩形区域内的点。:param contour: 多边形轮廓点集:param Bbox: 矩形区域的边界坐标信息[left_x, up_y, right_x, down_y]:return: 位于多边形内且在矩形区域内的点数组"""left_x, up_y, right_x, down_y=BboxNx = 2 ** 8Ny = 2 ** 8pixel_X = np.linspace(left_x, right_x, Nx)pixel_Y = np.linspace(up_y, down_y, Ny)xx, yy = np.meshgrid(pixel_X, pixel_Y)mask = np.zeros(xx.shape, dtype=bool)for i in range(xx.shape[0]):for j in range(xx.shape[1]):if cv2.pointPolygonTest(contour, (xx[i, j], yy[i, j]), False) > 0:mask[i, j] = Truein_point = np.column_stack((xx[mask], yy[mask]))return in_pointdef find_max_radius(self,contous, pixelx, pixely, small_r, big_r, precision):"""在给定轮廓内查找最大半径。:param contours: 轮廓:param pixelx: 圆心的像素 x 坐标:param pixely: 圆心的像素 y 坐标:param small_r: 最小半径:param big_r: 最大半径:param precision: 精度:return: 最大半径"""radius = small_rL = np.linspace(0, 2 * math.pi, 360)circle_X = pixelx + radius * cos(L)circle_Y = pixely + radius * sin(L)for i in range(len(circle_Y)):if cv2.pointPolygonTest(contous, (circle_X[i], circle_Y[i]), False) < 0:return 0while big_r - small_r >= precision:half_r = (small_r + big_r) / 2circle_X = pixelx + half_r * cos(L)circle_Y = pixely + half_r * sin(L)if_out = Falsefor i in range(len(circle_Y)):if cv2.pointPolygonTest(contous, (circle_X[i], circle_Y[i]), False) < 0:  # 如果圆散集有在轮廓之外的点big_r = half_rif_out = Trueif not if_out:small_r = half_rradius = small_rreturn radiusdef find_optimal_information(self,in_point,big_r,precision,contous,sample_ratio=0.01):"""从一组点中寻找具有最大内切圆半径的点。:param in_point: 点集合:param big_r: 内切圆最大半径:param precision: 精度:param contous: 多边形轮廓:param sample_ratio: 采样比例:return: 具有最大内切圆半径的点的坐标和半径"""num_points = len(in_point)num_samples = max(1, int(num_points * sample_ratio))sampled_indices = random.sample(range(num_points), num_samples)sampled_indices.sort()best_radius = 0center = Nonefor idx in sampled_indices:point = in_point[idx]max_radius_for_point = self.find_max_radius(contous, point[0], point[1], best_radius, big_r, precision)if max_radius_for_point > best_radius:best_radius = max_radius_for_pointcenter = pointremaining_indices = [i for i in range(num_points) if i not in sampled_indices]for idx in remaining_indices:point = in_point[idx]max_radius_for_point = self.find_max_radius(contous, point[0], point[1], best_radius, big_r, precision)if max_radius_for_point > best_radius:best_radius = max_radius_for_pointcenter = pointreturn best_radius, centerdef FindmaxIncircle(self, circle_list):"""在裂缝最大内切圆信息中找到具有最大半径的内切圆的中心坐标和半径。:param circle_list: 裂缝最大内切圆信息列表,每个元素为 [radius, center]:return: 最大半径的内切圆的中心坐标和半径"""max_radius = max(circle_list, key=lambda x: x[0])[0]max_center = next(item for item in circle_list if item[0] == max_radius)[1]return max_center, max_radiusdef draw_contous_circle(self,original_img, contours, circle_list, max_radius, max_center):"""在原始图像上绘制轮廓及内切圆。:param original_img: 原始图像:param contours: 轮廓列表:param circle_list: 扩展圆信息列表:param max_radius: 最大内切圆半径:param max_center: 最大内切圆中心:return: 绘制了轮廓和内切圆的图像"""cv2.drawContours(original_img, contours, -1, (0, 0, 255), -1)for circle_info in circle_list:radius, center = circle_info[:2]color = (255, 0, 0) if radius == max_radius else (255, 245, 0)if radius == max_radius:cv2.circle(original_img, (int(max_center[0]), int(max_center[1])), int(max_radius), color, 2)else:cv2.circle(original_img, (int(center[0]), int(center[1])), int(radius), color, 2)return original_imgdef dealwith_inCircle(img,imgoriginal,showCircle=True):"""处理内切圆问题并显示结果。:param img: 输入处理的标签图像:param img_original: 对应的原始图像:param show_circle: 是否显示内切圆结果,默认为 True"""mac = Maximum_width()contous = mac.findContous(img)expansion_circle_list = []for con in contous:left_x, right_x, down_y, up_y = np.min(con[:, 0, 0]), np.max(con[:, 0, 0]), np.max(con[:, 0, 1]), np.min(con[:, 0, 1])Bbox=[left_x, up_y, right_x, down_y]upper_r = min(right_x - left_x, down_y - up_y) / 2precision = math.sqrt((right_x - left_x) ** 2 + (down_y - up_y) ** 2) / (2 ** 13)      #获得二分精度in_point=mac.Extract_repeat_points(con, Bbox)radius,center=mac.find_optimal_information(in_point,upper_r,precision,con)expansion_circle_list.append([radius, center])max_center,max_radius=mac.FindmaxIncircle(expansion_circle_list)if showCircle:Circle=mac.draw_contous_circle(imgoriginal,contous,expansion_circle_list,max_radius,max_center)cv2.imshow("Maximum Inscribed Circle",Circle)cv2.waitKey(0)return round(max_radius*2,2)if __name__=="__main__":from pyzjr.dlearn.tools import Runcodeswith Runcodes("最大内切圆算法"):path = r"D:\PythonProject\RoadCrack\dimension2_data\num/024.png"  # 分割图path2 = r"D:\PythonProject\RoadCrack\dimension2_data\image/013.jpg"  # 对应的原图img = cv2.imread(path)img2 = cv2.imread(path2)width=dealwith_inCircle(img,img2,False)print(f'最大宽度:{round(width, 2)}')

最大宽度:13.84

将标签图放大,可以数一数确实还可以,大致在13左右。使用的方式是通过从给定的轮廓中提取点,并使用二分法来查找最大内切圆的半径。它通过在多个采样点上尝试不同的半径大小,验证这些半径是否有效来确定最大内切圆。最后,绘制了找到的最大内切圆以及相关的轮廓,这个博主实现的算法可以用,但这个算法加在ui里面还是稍微的比较卡,在我看来这里其实是不用这么多的,这个算法还有其他的方法去实现,后面我会单独出一篇,毕竟这个是一个新的创新点。

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

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

相关文章

ICCV 2023|Occ2Net,一种基于3D 占据估计的有效且稳健的带有遮挡区域的图像匹配方法...

本文为大家介绍一篇入选ICCV 2023的论文&#xff0c;《Occ2Net: Robust Image Matching Based on 3D Occupancy Estimation for Occluded Regions》&#xff0c; 一种基于3D 占据估计的有效且稳健的带有遮挡区域的图像匹配方法。 论文链接&#xff1a;https://arxiv.org/abs/23…

[红明谷CTF 2021]write_shell %09绕过过滤空格 ``执行

目录 1.正常短标签 2.短标签配合内联执行 看看代码 <?php error_reporting(0); highlight_file(__FILE__); function check($input){if(preg_match("/| |_|php|;|~|\\^|\\|eval|{|}/i",$input)){ 过滤了 木马类型的东西// if(preg_match("/| |_||php/&quo…

Java应用生产Full GC或者OOM问题如何定位

1 引言 生产应用服务频繁Full GC却无法释放内存&#xff0c;甚至可能OOM&#xff0c;这种情况很有可能是内存泄露或者堆内存分配不足&#xff0c;此时需要dump堆信息来定位问题&#xff0c;查看是哪些地方内存泄漏。 Dump文件也称为内存转储文件或内存快照文件&#xff0c;是…

【Axure】常见元件、常用交互效果

产品结构图 以微信为例&#xff0c;根据页面层级制作 动态面板 动态面板的作用&#xff1a;动态面板是一个可视区域&#xff0c;如果要把控件放进去&#xff0c;要全部放进去&#xff0c;放多少显示多少 文本框 隐藏边框方法&#xff1a;先拉一个矩形&#xff0c;去掉部分…

基于Java的汽车票网上预订系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作…

在windows的ubuntu LTS中安装及使用EZ-InSAR进行InSAR数据处理

EZ-InSAR&#xff08;曾被称为MIESAR&#xff0c;即Matlab界面用于易于使用的合成孔径雷达干涉测量&#xff09;是一个用MATLAB编写的工具箱&#xff0c;用于通过易于使用的图形用户界面&#xff08;GUI&#xff09;进行干涉合成孔径雷达&#xff08;InSAR&#xff09;数据处理…

vue-cli项目打包体积太大,服务器网速也拉胯(100kb/s),客户打开网站需要等十几秒!!! 尝试cdn优化方案

一、首先用插件webpack-bundle-analyzer查看自己各个包的体积 插件用法参考之前博客 vue-cli项目中&#xff0c;使用webpack-bundle-analyzer进行模块分析&#xff0c;查看各个模块的体积&#xff0c;方便后期代码优化 二、发现有几个插件体积较大&#xff0c;有改成CDN引用的…

亚信科技AntDB数据库 高并发、低延迟、无死锁,深入了解AntDB-M元数据锁的实现

AntDB-M在架构上分为两层&#xff0c;服务层和存储引擎层。元数据的并发管理集中在服务层&#xff0c;数据的存储访问在存储引擎层。为了保证DDL操作与DML操作之间的一致性&#xff0c;引入了元数据锁&#xff08;MDL&#xff09;。 AntDB-M提供了丰富的元数据锁功能&#xff0…

【Axure高保真原型】3D圆柱图_中继器版

今天和大家分享3D圆柱图_中继器版的原型模板&#xff0c;图表在中继器表格里填写具体的数据&#xff0c;调整坐标系后&#xff0c;就可以根据表格数据自动生成对应高度的圆柱图&#xff0c;鼠标移入时&#xff0c;可以查看对应圆柱体的数据……具体效果可以打开下方原型地址体验…

一文带你搞懂Redis持久化

Redis持久化 Redis的数据是存储在内存的&#xff0c;当程序崩溃或者服务器宕机&#xff0c;那么内存里的数据就会丢失。所以避免数据丢失的情况&#xff0c;需要将数据保存到其他的存储设备中。 Redis提供两种方式来持久化&#xff0c;分别是 RDB(Redis Database)&#xff1a…

【LeetCode热题100】--19.删除链表的倒数第N个结点

19.删除链表的倒数第N个结点 注意&#xff1a;先声明一个头结点&#xff0c;它的next指针指向链表的头节点&#xff0c;这样就不需要对头节点进行特殊的判断 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListN…

【Java每日一题】——第十六题:将数组元素逆序并遍历输出。(2023.09.30)

&#x1f578;️Hollow&#xff0c;各位小伙伴&#xff0c;今天我们要做的是第十五题。 &#x1f3af;问题&#xff1a; 设有数组如下&#xff1a;int[] arr{11,34,47,19,5,87,63,88}; 测试结果如下&#xff1a; &#x1f3af; 答案&#xff1a; int a[]new int [10];Random …

华为云HECS云服务器docker环境下安装nginx

前提&#xff1a;有一台华为云服务器。 华为云HECS云服务器&#xff0c;安装docker环境&#xff0c;查看如下文章。 华为云HECS安装docker-CSDN博客 一、拉取镜像 下载最新版Nginx镜像 (其实此命令就等同于 : docker pull nginx:latest ) docker pull nginx查看镜像 dock…

ai创作工具,怎么使用AI创作工具

不论是写一篇博客、发布自媒体、还是设计广告文案&#xff0c;创作都成为了我们日常生活和工作中不可或缺的一部分。但是&#xff0c;许多人可能会面临写作灵感枯竭、时间不足或需要大量内容的问题。 写作对于很多人来说&#xff0c;不仅是一项技能&#xff0c;更是一种挑战。有…

Spring学习笔记11 GoF代理模式

Spring学习笔记10 JdbcTemplate_biubiubiu0706的博客-CSDN博客 新建个maven模块 static-proxy 演示静态代理 订单接口 测试 需求:统计每个业务方法的耗时 package com.example.proxy.service;/*** author hrui* date 2023/9/25 8:42*/ public class OrderServiceImpl implem…

Linux CentOS7 vim临时文件

在vim中&#xff0c;由于断网、停电、故意退出、不小心关闭终端等多种原因&#xff0c;正在编辑的文件没有保存&#xff0c;系统将会为文件保存一个交换文件&#xff0c;或称临时文件&#xff0c;或备份文件。 如果因某种原因产生了交换文件&#xff0c;每次打开文件时&#x…

ffmpeg、ffplay在线安装,离线导出整个程序,移植到其他服务器使用(linux系统)

环境说明 以ubuntu系统作为说明 在线安装 下面命令会同时安装ffplay和ffmpeg sudo apt-get install ffmpeg怎么验证安装成功&#xff1f; 输入ffmpeg命令 ffmpeg&#xff0c;如图则说明安装成功 转储可执行程序和依赖的文件 找到安装路径&#xff0c;一般在/usr/bin目录…

idea Springboot 教师标识管理系统开发mysql数据库web结构java编程计算机网页源码maven项目

一、源码特点 springboot 教师标识管理系统是一套完善的信息系统&#xff0c;结合springboot框架和bootstrap完成本系统&#xff0c;对理解JSP java编程开发语言有帮助系统采用springboot框架&#xff08;MVC模式开发&#xff09;&#xff0c;系统 具有完整的源代码和数据库&…

Codeforces Round 894 (Div. 3) D(数学题好难不会)

题目链接&#xff1a;Codeforces Round 894 (Div. 3) D 题目&#xff1a; 特马决定提高自己制作冰淇淋的技能。他已经学会了如何用两个球把冰淇淋做成圆锥形。 在痴迷冰淇淋之前&#xff0c;特马对数学很感兴趣。因此&#xff0c;他很想知道要制作完全n个不同类型的冰淇淋&am…

唤醒手腕 2023年 B 站课程 Golang 语言详细教程笔记(更新中)

0001、1000集GO语言Flag毒誓 唤醒手腕UP猪Pig目标花费1000集进行讲解Go语言视频学习教程&#xff08;有趣的灵魂&#xff0c;适合小白&#xff0c;不适合巨佬&#xff09;&#xff0c;从2023年3月19日开始&#xff0c;将会一直每天更新&#xff0c;准备在2024年5月1日之前更新…