2021年亚太杯APMCM数学建模大赛A题图像边缘分析与应用求解全过程文档及程序

news2024/10/5 18:29:12

2021年亚太杯APMCM数学建模大赛

A题 图像边缘分析与应用

原题再现:

  随着科学技术的发展,对各种工件和零部件测量精度的要求越来越高,对测量仪器的要求也越来越高。数字图像尺寸测量仪器等各种图像测量设备目前正逐渐取代传统的手动卡尺测量应用。一般来说,在相机校准后,根据校准图像的点矩阵或棋盘特征信息,对图像进行失真校正,计算出图像坐标空间与世界坐标空间之间的映射关系。
  目标对象的边缘对图像识别和计算机分析非常有用。图像边缘是对图像的局部特征的不连续性的反映。该边缘可以勾勒出目标物体,并让观察者一眼就看清楚它。边缘包含丰富的内在信息(如方向、步长属性和形状等),这是在图像识别中提取图像特征的一个重要属性。图像边缘轮廓提取是边界分割中一个非常重要的处理过程,也是图像处理中的一个经典问题。轮廓提取和轮廓跟踪的目的都是获取图像的外部轮廓特征。在必要时应用某些方法来表示轮廓的特征,以准备图像形状分析,对执行特征描述、识别和理解等高级处理具有重要影响。
  该轮廓可以被描述为一组有序的点,并且该轮廓的共同表达式是一个多边形。轮廓既可以关闭,也可以打开。图像上的闭合轮廓从头到尾都是连接的,开放的轮廓通常与图像边界相交。在图1中,有5条封闭的轮廓曲线。虽然sobel、canny等边缘检测算法可以根据图像灰度值的差值来检测图像边缘像素的边界,但它并不考虑一个整体的轮廓。在一个图像上,一个轮廓对应于一系列的像素点。该轮廓描述了一个连续的点序列,并且边缘像素点可以组装成一个轮廓曲线来描述图像的边缘信息。
  子像素是在图像采集传感器的两个物理像素之间定义的虚拟像素。为了提高分辨率或图像质量,亚像素计算非常有用。图像亚像素边缘提取是一种比传统的像素边缘提取更精确的方法。子像素表示图像上每个像素点的坐标值不再是整数定位,而是浮点数位。如果使用亚像素技术将精度提高到0.1像素,则相当于图像系统分析分辨率的10倍。
  对于以下三幅示意图,在图1中,我们提取了图像的对象边缘轮廓线,并将图像边缘轮廓分割为直线段、圆弧段、圆段等基本图形。在图2中,一个圆角矩形的边缘轮廓被划分为几个几何形状。在图3中,在灰度像素图像网格的背景上绘制了一条椭圆的亚像素轮廓曲线。
在这里插入图片描述
  问题1:建立数学模型,分析1/10像素精度以上亚像素边缘提取方法和过程,提取附件1三个图像(Pic1_1、Pic1_2、Pic1_3)上对象主边缘部分的亚像素边缘轮廓边界,将边缘亚像素点数据转换为有序边缘轮廓曲线数据,需要考虑如何消除边缘毛边和阴影部分的干扰效应。请注意,Pic1_3图像是在相对复杂的光照条件下拍摄的,并且有更多的干扰信息。
  a) 请在图像上绘制不同颜色提取的边缘轮廓,输出为彩色边缘轮廓图像,并保存为png图像格式,以便提交。文件名为pic1_1.png、pic1_2.png、pic1_3.png。
  b) 输出附件1中EdgeContoursOutput.xls文件格式的边缘轮廓数据,并将Pic1_1和Pic1_2图像的数据分别输出到工作表对应的表1和表2中。输出数据包含总边轮廓数、图像坐标空间中的总边轮廓长度、每个轮廓曲线的点数和长度,以及每个轮廓点的X、Y坐标数据。
  c) 本文应给出各图像上的总轮廓曲线计数以及各曲线上的点计数和长度数据。详见表1、表2、表3。
在这里插入图片描述
在这里插入图片描述
  问题2:在拍摄测量的图像时,在与目标物体相同的水平高度处放置一个点矩阵校准板。校准板上的点的直径为1mm,两个点之间的中心距离为2mm。附件2包含三个以不同角度拍摄的校准板图像和一张产品图像(Pic2_4.bmp)。请建立数学模型,利用校准板图像信息对产品图像进行图像整正分析,并考虑如何尽可能准确地计算产品图像上边缘分割拟合曲线段的实际物理尺寸。请计算每个边缘轮廓的长度(mm),最后计算出边 线 总 长 度 (mm) 。 根 据 图 4 所 示 的 轮 廓 数 据 标 注 , 输 出 附 录 2 中 的EdgeContoursLengthOutput.xls等表格式文件的数据结果。

在这里插入图片描述
  问 题 3 : 附 件 3 提 供 了 两 个 亚 像 素 轮 廓 边 缘 数 据 (EdgeContour1.xls 和EdgeContour2.xls),形状如图5所示。建立数学模型,分析边缘轮廓曲线数据的自动分割拟合成直线段、圆弧段(含圆)或椭圆弧段(含椭圆),讨论边缘轮廓自动分割拟合的模型方法或策略。蓝色曲线从蓝色数字1标签开始,沿箭头方向输出模型计算结果数据。绿色曲线从绿色数字1标签开始,沿箭头方向输出模型计算结果数据。请将分段曲线段的参数填写到表格中。提交了论文中的表7和表8(关于轮廓1和轮廓2的分割数据)。请注意,此表中的行的类型是根据实际类型进行填充的。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
  备注:
  1. 扫角表示从起点到终点的扫描角度,角度系统;
  2. 尺寸表示指定椭圆或椭圆弧的半径值;
  3. 旋转角度表示指定的椭圆或椭圆弧、角度系统的旋转角度值;
  4. 对于旋转角度的方向,从x轴正方向到y轴正方向的旋转方向为正方向,反之亦然,为负方向。
  5. 所有图像坐标点均在图像坐标系下表示,即左上角为(0,0)原点,x轴正向向右,y轴正向向下。

整体求解过程概述(摘要)

  随着技术的突飞猛进,对测量仪器的要求也越来越高。本文介绍了边缘图像分割以及Canny算法和亚像素图像。零件的实际长度是根据校准板像素与实际距离的关系来测量的。最后,利用Ramer算法对图像进行拟合,然后准确提取图像边缘轮廓的实际数据。

  对于问题1,通过绘制子像素边缘轮廓,首先需要将边缘子像素数据转换为有序的边缘轮廓曲线数据,考虑如何消除边缘毛边和阴影部分的干涉效应。Pic1_1和Pic1_2两个图像以相同的方式处理,使用拉普拉斯算子锐化图像,平滑图像轮廓,然后对OTSU二值化和高斯滤波进行阈值化去噪,最后用Canny算法粗略分割。处理Pic1_3图像是在环境复杂的条件下拍摄的。采用PSO-OTSU算法减少图像的亮点,最后进行零件缺陷检测和轮廓修复,得到理想的轮廓检测二值化图像。然后进行亚像素边缘检测,判断图像是否已经达到0.1像素,最后通过Ramer算法对图像边缘轮廓进行分割。

  对于问题2,在测量给定零件图片的真实长度时,请根据给定水平的校准版本进行测量。所提供的产品图像的真实长度是根据提供的三种不同角度的校准板图像测量的。对于图像预处理,图像预处理需要OTSU二值化分割、高斯滤波去噪、图像校正和Canny算法分割。零件的拉普拉斯算子的图像锐化给出了最终的分割零件分割图像。后期,校准板和零件的亚像素级图像分割需要提取标记点的轮廓边缘,提高中心距测量的精度,零件需要测量精度以获得零件每个区域的像素周长。最后,测量每个零件的真实长度。

  对于问题 3,对附件中提供的两个亚像素轮廓边缘数据进行建模,分析边缘轮廓曲线数据以拟合直线段、弧段或椭圆弧段,通过 Halcon 找到边缘的分割,得到轮廓的直线、圆和椭圆根据亚像素坐标数据读取,最后得到轮廓的中心、起始位置和终止位置。首先,在纸上执行轮廓分割,然后执行轮廓拟合中使用的Ramer算法,并进行边缘轮廓数据提取。

模型假设:

  1.假设在提取图像定位点时,与最多线相交的点是图像的唯一中心点;
  2.假设校准板高度与零件拍摄高度一致。

问题分析:

  对于问题 1
  要绘制子像素边缘轮廓,首先提取边缘轮廓,然后将边缘子像素数据转换为有序边缘轮廓的曲线数据,同时考虑如何消除边缘边缘和阴影部分的干涉效应。Pic1_1和Pic1_2两张图像以相同的方式进行处理,使用拉普拉斯算子锐化图像,平滑图像轮廓,然后进行OTSU二值化阈值和高斯滤波去噪,最后使用Canny算法进行粗略分割。处理Pic1_3图像是在环境复杂的条件下拍摄的。采用PSO-OTSU算法降低图像的亮点,最终对零件缺陷进行检测和轮廓修复,得到理想的轮廓检测二值化图像。然后进行亚像素边缘检测,判断图像是否达到0像素,最后用Ramer算法对图像边缘轮廓进行分割。

  对于问题 2
  在测量给定组件图片的真实长度时,需要根据给定电平的校准版本进行测量。真实长度根据提供的三种不同角度的校准板图像进行测量。图像处理需要通过OTSU二值化分割、高斯滤波去噪、图像校正和Canny算法分割进行图像预处理。零件的拉普拉斯算子的图像锐化给出了最终的分割零件分割图像。后期,校准板和零件的亚像素级图像分割需要提取标记点的轮廓边缘,提高中心距测量的精度,零件需要测量精度以获得零件每个区域的像素周长。最后,测量每个零件的真实长度。

  对于问题 3
  通过附件中提供的两个子像素轮廓边缘数据,对边缘轮廓分割进行建模,分析边缘轮廓曲线数据以拟合直线段、弧段或椭圆弧段,通过 Halcon 找到 Edge,根据读取的子像素坐标数据获取直线、圆和椭圆轮廓,最后得到中心, 轮廓的起始位置和终止位置无处不在。首先,将Ramer算法用于边缘轮廓的轮廓拟合和数据提取。

模型的建立与求解整体论文缩略图

在这里插入图片描述
在这里插入图片描述

全部论文请见下方“ 只会建模 QQ名片” 点击QQ名片即可

程序代码:

部分程序如下:

import cv2
import numpy as np

img = cv2.imread('/home/yasin/coffe.jpg')
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

_, contours, hierarchy = cv2.findContours(img_gray, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

cv2.drawContours(img, contours, -1, (255, 0, 255), 1)
cv2.namedWindow('Result of drawContours', 0)
cv2.imshow('Result of drawContours', img)
cv2.waitKey()


cnt = 0
for i in range(len(contours)):
    arclen = cv2.arcLength(contours[i], True)
    epsilon = max(3, int(arclen * 0.02))   
    approx = cv2.approxPolyDP(contours[i], epsilon, False) # 轮廓的多边形拟合
    area = cv2.contourArea(contours[i])     # 计算面积
    rect = cv2.minAreaRect(contours[i])
    box = np.int0(cv2.boxPoints(rect))    
    h = int(rect[1][0])
    w = int(rect[1][1])
    if min(h, w) == 0:
        ration = 0
    else:
        ration = max(h,w) /min(h,w)   


    if ration < 10 and area > 20 and area < 4000 and approx.shape[0] > 3 :

        cv2.polylines(img, [approx], True, (0, 255, 0), 1)

cv2.namedWindow('Result of filtered', 0)
cv2.imshow('Result of filtered', img)
cv2.waitKey()
全部论文请见下方“ 只会建模 QQ名片” 点击QQ名片即可

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

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

相关文章

Vue 常用内置指令

Vue 常用内置指令描述指令内容渲染指令{{}} 与 v-text覆盖面积v-text{{}}闪现问题{{}}v-textv-html属性绑定指令v-bind简写 :事件绑定指令v-on参数事件对象$event事件修饰符按键修饰符双向绑定指令v-model修饰符条件渲染指令v-show 与 v-if 的区别实现原理性能消耗举个栗子v-el…

C#构建Web服务项目实战(二)

概述本文演示了如何通过Ajax访问C# ASP.NET项目中的WebService方法&#xff08;.asmx文件形式&#xff09;。本文的项目配置参见前文&#xff1a;C#构建Web服务项目实战&#xff08;一&#xff09;。环境Visual Studio 2017 / VS2019C# ASP.NET Web服务Win11 / Win10类似.NET F…

由浅入深地学习指针(学习指针必看)

目录 指针初阶 指针定义 指针和指针类型 c语言的整型指针解引用与整型变量的区别 内存 指针和指针类型 指针类型的意义 野指针 规避野指针 指针运算 指针和数组 二级指针 指针数组 指针进阶 指针的概念再提起 字符指针 《剑指offer》 字符串常量&#xff1a; …

【基于机械臂触觉伺服的物体操控研究】UR5e运动学建模及代码实现

我的毕设题目定为《基于机械臂触觉伺服的物体操控研究》&#xff0c;这个系列主要用于记录做毕设的过程。 前言&#xff1a;UR系列是优傲公司的代表产品&#xff0c;也是目前比较通用的产品级机械臂。所以我打算用该机械臂进行毕设的仿真实现。关于其运动学建模&#xff0c;网…

【每日一题】【LeetCode】【第十二天】区域和检索 - 数组不可变

解决之路 题目描述 测试案例&#xff08;部分&#xff09; 第一次 emmm&#xff0c;说实话&#xff0c;一开始我还真没看懂题目是什么意思。。。。 自己按我自己理解的方式写了一下代码&#xff0c;用测试案例跑了下&#xff0c;成功了。 不过&#xff0c;放进去跑不通&…

VScode远程调试深度学习debug

VS Code CtrlP&#xff0c;在搜索框>select interpreter检查一下python环境 #查看GPU 环境&#xff1b;版本号 nvidia-smi.exe使用VSCode进行深度学习首先进行debug 首先要安装Remote Development个人理解可以远程打开编辑文件。 点击左下角的箭头&#xff0c;在对话框中…

async-excel整合站内信通知用户体验感满满

前面的文章我们讲过消息中心站内信的实现 【消息中心】 那么本章我们来说说异步导入导出完成后&#xff0c;如何使用消息中心站内信的功能进行通知用户业务处理完成了 在async-excel中异步逻辑处理完成后会调用一个callback方法进行回调&#xff0c;所以我们可以再对async-exc…

完全二叉树与堆(包含STL堆的用法)

完全二叉树 完全二叉树为一类特殊的二叉树&#xff0c;高度为h的完全二叉树满足如下条件&#xff1a; &#xff08;1&#xff09;所有叶结点都出现在第h或h-1层&#xff1b; &#xff08;2&#xff09;第h-1层的所有叶结点都在非叶结点的右边&#xff1b; &#xff08;3&#…

AAAI 2023|模拟人脑场景感知过程,套娃Transformer讲故事能力更上一层楼

原文链接&#xff1a;https://www.techbeat.net/article-info?id4467 作者&#xff1a;seven_ 视频字幕生成目前已成为工业界AI创作领域非常火热的研究话题&#xff0c;这一技术可以应用在短视频的内容解析和讲解中&#xff0c;AI讲故事的技术已经越来越成熟。而在学术界&…

13、ThingsBoard-如何发送告警邮件

1、概述 很多时候,我们使用thingsboard的时候,会遇到比如一个设备触发了告警,如何将设备的告警消息定义成邮件模板,然后通知租户或者客户管理员,管理员进行处理,这样的需求是非常重要的。 2、实现的步骤 要实现这个需求我总结了几步: 2.1、设备上报的参数与阈值进行…

基于关键点检测的病患步态检测及分析方法

在临床工作中&#xff0c;对患有神经系统或骨骼肌肉系统疾病而可能影响行走能力的患者需要进行步态分析&#xff0c;以评定患者是否存在异常步态以及步态异常的性质和程度 步态评定临床意义 1、评估患者是否存在异常步态以及步态异常的性质和程度 2、为分析异常步态原因和矫正异…

看我们应用性能监控如何几秒钟定位慢访问跟因

背景 某汽车集团的汽车配件电子图册系统是其重要业务系统。最近业务部门反映&#xff0c;汽车配件电子图册调用图纸时&#xff0c;出现访问慢现象。 某汽车集团总部已部署NetInside流量分析系统&#xff0c;使用流量分析系统提供实时和历史原始流量。本次分析重点针对汽车配件…

二进制?十进制!

链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 来源&#xff1a;牛客网 给定两个十进制整数 : AAA,BBB 你需要把它们的二进制形式以十进制的运算法则相加输出结果。 例如&#xff1a; A3,B2A 3 , B 2A3,B2 的时候&#xff0c;AAA 的二进制表示是 : 111111 , BB…

Linux部署Nexus通过Maven推送及拉取代码

&#x1f60a; 作者&#xff1a; 一恍过去&#x1f496; 主页&#xff1a; https://blog.csdn.net/zhuocailing3390&#x1f38a; 社区&#xff1a; Java技术栈交流&#x1f389; 主题&#xff1a; Linux部署Nexus通过Maven推送及拉取代码⏱️ 创作时间&#xff1a; 2023年…

myBaits Expert Wheat Exome — 从多个小麦品种中富集超过250Mb的高可信度的外显子

myBaits Expert Wheat Exome 与国际小麦基因组测序联盟(IWGSC)合作开发&#xff0c;使用了IWGSC发布的中国春基因组和注释信息。靶向六倍体小麦中完整的高置信度且有基因注释的外显子区域,能够全面、统一、可靠地深入覆盖大干15 Gb的小麦基因组中超过250 Mb的CDS及其邻近区域。…

硅烷聚乙二醇活性酯;Silane-PEG-NHS;溶于大部分有机溶剂。仅供科研实验使用,不用于诊治

英文名称&#xff1a;Silane-PEG-NHS&#xff0c;Silane-PEG-SCM 中文名称&#xff1a;硅烷聚乙二醇活性酯 分子量&#xff1a;1k&#xff0c;2k&#xff0c;3.4k&#xff0c;5k&#xff0c;10k&#xff0c;20k。。。 存储条件&#xff1a;-20C&#xff0c;避光&#xff0c;…

数组常用方法总结 (5) :find / findIndex / filter

find 与前边讲过的 some 类似&#xff0c;用于检测数组的每一项是否符合限定条件。只要遇到一个符合条件的&#xff0c;就会停止循环。在循环中&#xff0c;如果是简单数组&#xff0c;数据不会被改变&#xff0c;如果是对象数组&#xff0c;数据会改变。如果停止了循环&#…

音频(七)——数字麦克风和模拟麦克风(DMIC/AMIC)

数字麦克风与模拟麦克风(DMIC/AMIC) 麦克风(mic)&#xff1a;是将声音信号转换为电信号的能量转换器件&#xff0c;也就是用来采集你说话的声音扬声器(speaker)&#xff1a;是一种把电信号转变为声信号的换能器件&#xff0c;就是把对方说话产生的电信号转换成声音播放出来。简…

比较C++在for循环中的i++和++i以及i++的O2优化的效率:++i真的比i++快吗

比较C在for循环中的i和i以及i的O2优化的效率&#xff1a;i真的比i快吗 前言 对i和i的争论褒贬不一&#xff0c;不知从何时起&#xff08;大概是学C的时候老师就是这么教的&#xff09;我的习惯是在for循环中使用i而不是i for (int i 0; i < n; i) // 典但是看到一些博客…

再说多线程(五)——死锁

在前面四节中&#xff0c;我们一直没有讨论多线程程序的一个负面问题——死锁&#xff0c;有了一定的基础&#xff0c;现在是时候研究一下死锁了。死锁一定是出现在多线程程序中&#xff0c;单线程是不可能造成死锁的&#xff0c;因为你不可能同时加两把锁。死锁有个简单的例子…