【2021 亚太赛】A题-Image Edge Analysis and application图像边缘分析与应用 参赛经历与思路与实现讲解

【2021 亚太赛】A题-Image Edge Analysis and application图像边缘分析与应用 参赛经历与思路与实现讲解

详细步骤参考以下博客
https://blog.csdn.net/weixin_43935696/article/details/121555038?spm=1001.2014.3001.5501

用到的东西

  • Python (主要用于数据处理)
  • opencv(这个后来不用了)/Halcon(这个是主要的软件)
  • Photoshop(看到这个大家是不是想打人)
  • Excel(计算第一题,还有填写问题中的表格)
  • 记事本(打开第一问第3小问导出的坐标数据)

问题一

问题分析:

  • 图像预处理(这一步很重要)
  • 亚像素级别的边缘检测

解决过程

首先进行图像的边缘检测,第一次用的是opencv,用的是canny算法,检测效果大致如下。

在这里插入图片描述
在这里插入图片描述
大家可以发现图1-1是可以检测出来的,但是图1-2就玩球了,图1-3更是惨不忍睹,基本噪声都给检测出来了。
所以要对图像进行预处理
预处理的过程大概有这么多:

  1. 图像增强
  2. 图像平滑
  3. 图像二值化
  4. 之后进行锐化等xxxx系列的形态学处理
    上述技术大家可以自行查阅资料,我也在参考文献里给大家提供了一些,都用红框圈出来了,方便大家查找

经过处理之后,大家可以看到检测的效果就非常可以了
(其实预处理之后也不理想,上文也说了,我用了ps预处理,预处理一天还不如我ps半小时的效果好)
在这里插入图片描述
在这里插入图片描述

这个时候可以看到图1-2有五个轮廓,1-3有2个轮廓
那么题目里要实现的是亚像素级别的检测。为啥要用亚像素,这个是看的一点文献里说的为啥要用亚像素。
在这里插入图片描述在这里插入图片描述在这里
这个都给大家整理好了,在文件夹里都能找到,都标记了一下。
我的理解就是下面这个意思。
在这里插入图片描述

大家看,a,b两条轮廓都过了像素1、2、3,在像素级别下,他们就被当成一条线了,但是当我们想要更高精度的时候,就需要转化为亚像素了。
亚像素一般可以分为3个方法,分别是:
基于矩的方法、拟合方法(最小二乘法)、插值的方法。(这个大家写论文的时候想用啥就用啥吧)
这里用的是Halcon里面的亚像素检测的方法,这个算子是edges_sub_pix(),具体参数设置大家可以看官方文档,先不说了,有时间再整理一波。
在这里插入图片描述

这里我选用的是canny算子和lanser2算子
可以看到边缘已经被检测出来了,那么我们就要回答问题了
在这里插入图片描述
对问题进一步归纳:

  • 计算边缘的长度
  • 计算过的像素点
  • 之后图1和图2的需要把轮廓的坐标导出来

这里有小伙伴可能有疑问,什么是过的像素点,什么是长度
我理解的是这样的在这里插入图片描述
a这条线过的像素点是3个,但是长度却不是3

我们可以通过Halcon带的分析工具轻松的得到边缘长度和过像素点的个数
选择轮廓——点击打开特征检测——选择xld_contlength和xld_area_points
在这里插入图片描述
下面是我的数据,这个会发给大家,文件命名是第一问实现过程。1、2、3的大家都可以拿去参考一下
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

之后单独保存坐标数据,我朋友写的是用Python,我这里用的excel处理的,因为时间不够了,Python代码当时没调好hhh
下面我说说excel的简单处理思路(这里就文字描述了)
以为提取出来的是起始点的x1和y1。终止点的x2和y2的数据。所以大家只需要给这四个值变成(x1,y1)和(x2.y2)的形式。其实就是两边加一个括号和中间加个逗号。
**这里要注意啊!!!!**图像坐标是这么定义的,左上角是原点(0,0),见下图
在这里插入图片描述

这里更要注意啊!!!,Halcon里的坐标col对应的题目里的x坐标,row对应的是y坐标。之后坐标显示是(row,col),如下图
在这里插入图片描述

A点的坐标显示是(4,10),是先显示列,再显示行,有点反人类,可能是能调整但是我没找到。
到此问题一就over了。

问题二

问题分析

  • 标定校正
  • 通过标定板来计算零件的实际尺寸

解决过程

同第一问,边缘检测效果如下
在这里插入图片描述
这里说一下代码里存在的问题,看这个最大的红色框框,之前算多了,把外框加进去了,当时程序的裁剪处理没调好参数,实际值应该是在这个左右的
在这里插入图片描述
标定板这里我就不说了,大家可以去看m哥的文档。简单描述为
求出两个圆心之间的dx,代码直接运行你就可以找到这个变量了,之后我们用下面的公式计算实际尺寸,解释一下:因为题目里说圆心距是2mm,所以找到有几个2mm就行了。
在这里插入图片描述
xi就是上表格中的像素长度值,第一问告诉大家怎么看了,dx就是程序里跑出来的,y_i就是我们要的实际尺寸。
再补充一下dx是啥:
在这里插入图片描述
这里我的dx就是代码里的distance/12,distance是上图两个红色圆圈之间的圆心距离
okk,表格填完,问题二解决!!

问题三

问题分析

之前问题一是从图像中直接提取出来的轮廓数据,之后把轮廓的坐标导出来
这个题,反过来了。他把第一问中的第三小问题的亚像素坐标数据给咱们了,之后我们得想办法给它转换成轮廓数据
之后再对轮廓进行切割,之后再检测出来每个基元(直线、圆弧、椭圆弧)

  • 轮廓切割
  • 直线段、圆、椭圆的拟合

实现过程

在这里插入图片描述

通过Halcon里面的gen_contour_polygon_xld算子,我们可以把坐标数据转为轮廓数据
之后用segment_contours_xld算子,可以把轮廓分割为直线、圆弧、椭圆弧。
最后用fit_line_contour_xld拟合直线、fit_circle_contour_xld拟合圆。
之后我们就可以得到他们的具体值了
这里直线我们可以得到起点坐标的x,y;终点坐标的x,y
圆弧的圆心坐标x,y;半径长度;圆弧开始的扫描角;圆弧结束的扫描角度

直线的问题就很简单了。我们只要知道起点坐标和终点坐标,就可以得到题目要求的所有属性
圆的问题,圆心可以得到了,之后扫描角度可以用:(圆弧开始的扫描角-圆弧结束的扫描角度)*180/π计算得到,它的方向是从x轴正向到y轴正向为正的。如下:
在这里插入图片描述
但是这里我遇到了一个问题,不知道怎么计算起点坐标和终点坐标
所以用了一个最原始的办法,就是去图里一个一个找,先把数据搞出来再说!!!
这步大家最好两个人做,这里要表扬一下本次被叫来打工的童鞋,我的室友一波

终于把表都填好啦!!!!
第三问勉勉强强Over

其实应该是不用这么搞的,但是连续干了27个小时,我的脑袋已经不转了,有机会再给大家提供计算方法吧,欢迎各位小伙伴一起探讨哈。

遇到的问题

解决了的

  • 图像预处理
  • 怎么导出坐标数据
  • 怎么把坐标数据转换为轮廓数据

没解决的

  • 图像预处理(你说解决了吧,它其实还没解决。用ps解决了,但是显然不行)
  • 第三问,分割之后,进行拟合,会发现有许多短的圆弧被检测为直线段了,例如这下面的白色小段,其实是圆弧,但是却拟合为直线了。
    在这里插入图片描述
  • 时间问题,只检测了圆弧,没有椭圆弧,有了初步的思路,但是时间不允许,如果解决椭圆弧,那么上边的问题就解决了
  • 我们采用的算子只能检测直线和圆弧、直线和椭圆弧,并没有直线+圆弧+椭圆弧这个操作,如果大家有兴趣可以一起沟通一下,应该是没找到这个功能。

小结

这个就是我的真实解题过程了,有很多地方因为知识欠缺,能力不够,走了捷径。有研究这方面的大佬看到了请忽略哈哈哈哈,当然如果可以帮我讲讲办法更好了。

  • 22
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一川风絮千片雪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值