目录

  • 简介
  • 极坐标变换
    • 定义
    • 原理
    • Halcon中的极坐标变换
      • 1、polar_trans_image_ext算子用法与参数剖析
      • 2、polar_trans_region_inv算子用法与参数剖析
    • 圆环类缺陷检测思路与步骤
  • Halcon实例
    • 实例简介
    • 程序解读
    • 思路剖析
  • 应用实例1
    • 项目介绍
    • 处理程序
    • 处理效果
  • 应用实例2
    • 项目介绍
    • 处理程序
    • 处理效果

简介

圆环类检测在我们日常的缺陷检测中经常遇到。比如玻璃瓶口的缺陷检测,硬币的缺陷检测,胶垫的缺陷检测…
我们对于圆环检测不像对于矩形等物体的检测,检测区域比较规整,便于我们使用形态学对区域进行筛选,但是圆环物品我们发现会出现一些问题,比如使用矩形形态学会对环形的边界处理产生影响等等。在这种情况下我们可以使用极坐标变换的方法,将环形转换成矩形进而对缺陷进行处理。

图例:

极坐标变换

定义

在图像处理中,尤其是在处理环形、圆形图像的过程中,会使用到极坐标变换。将方形图像转换成圆形,即“方转圆”。或者实现圆形转换成方形“圆转方”。

我们把圆形图像转换成方形图像的过程称为图像的极坐标变换;反之则为图像的反极坐标变换

原理

极坐标想必学过高中数学的人都听过,一般的坐标系中用(x, y)值来描述一个点的位置,而在极坐标系中,则使用到原点的距离ρ和夹角θ来描述该点的位置。
首先,正常的图像都是在直角坐标系下的,可以看做一个二维平面。我们要对图像进行坐标变换,首先要把位置转换到新的坐标系,然后将值赋过去。
这里有两个值需要确定:1.位置 2.值。即变换后任一个像素的值与位置。
这里:变幻后的值不变。即求解变幻的位置关系式
极坐标变换及其反变换的关键在于,根据极坐标变换前的图像确定极坐标变换后的图像上每个像素点的像素值。也即是找到“圆图”和“方图”间几何坐标的对应关系。

证明:

如上图所示,实现极坐标变换的关键即在于找到圆图上任一点P(i,j),在方图上对应的点p(m,n),然后通过插值算法实现圆图上所有像素点的赋值。

方图上,其行列数分别为M、N,方图上的每一列对应为圆图上的每条半径,半径方向存在着一个长度缩放因子delta_r = M/R,圆周方向被分为N等分,即角度因子为delta_t = 2π/N;

圆图上,图像坐标(i,j)和世界坐标(x,y)有着如下变换关系:x = j - R, y = R - i;

那么,图中P点半径长度为r = sqrt(xx + yy),角度theta = arctan(y/x);

圆图上点P在方图上对应行数为r/delta_r;

圆图上点P在方图上对应的列数n = thata/delta_t。

以上就是极坐标变换的基本原理,结合相应的插值算法,即可实现图像的极坐标变换。

Halcon中的极坐标变换

在halcon中极坐标变换算子:
polar_trans_image_ext(针对图像);polar_trans_region(针对区域);polar_trans_contour_xld(针对XLD轮廓)。
在halcon中反极坐标变换算子:
polar_trans_image_inv(针对图像); polar_trans_region_inv(针对区域);polar_trans_contour_xld_inv(针对XLD轮廓)。

1、polar_trans_image_ext算子用法与参数剖析

算子原型:
polar_trans_image_ext(Image : PolarTransImage : Row, Column, AngleStart, AngleEnd, RadiusStart, RadiusEnd, Width, Height, Interpolation : )
参数说明:
Image (input_object)(多通道)图像(-array)→对象(byte * / int2 * / uint2 * / real *)*允许计算设备
输入图像。
PolarTransImage(output_object)(多通道)图像(-array)→对象(字节/ int2 / uint2 /实数)
输出图像。
Row(input_control)编号→(实数/整数)
圆弧中心的行坐标。
默认值:256
建议值:0、16、32、64、128、240、256、480、512
Column(input_control)号→(实数/整数)
圆弧中心的列坐标。
默认值:256
建议值:0、16、32、64、128、256、320、512、640
AngleStart(input_control)数字→(实数)
要映射到输出图像第一列的射线角度。
默认值:0.0
建议值:0.0,0.78539816,1.57079632,3.141592654,6.2831853,12.566370616
AngleEnd(input_control)数字→(实数)
要映射到输出图像最后一列的射线角度。
默认值:6.2831853
建议值:0.0,0.78539816,1.57079632,3.141592654,6.2831853,12.566370616
RadiusStart(input_control)数字→(实数/整数)
要映射到输出图像第一行的圆的半径。
默认值:0
建议值:0、16、32、64、100、128、256、512
典型值范围:0≤RadiusStart
RadiusEnd(input_control)数字→(实数/整数)
要映射到输出图像最后一行的圆的半径。
默认值:100
建议值:0、16、32、64、100、128、256、512
典型值范围:0≤RadiusEnd
Width(input_control)数→(整数)
输出图像的宽度。
默认值:512
建议值:256、320、512、640、800、1024
典型值范围:0≤宽度≤32767
Height(input_control)数→(整数)
输出图像的高度。
默认值:512
建议值:240、256、480、512、600、1024
典型值范围:0≤高度≤32767
Interpolation (input_control)字符串→(string)
内插法进行变换。
默认值:“ nearest_neighbor”
值列表:‘bilinear’,‘nearest_neighbor’

2、polar_trans_region_inv算子用法与参数剖析

算子原型:
polar_trans_image_inv(PolarImage : XYTransImage : Row, Column, AngleStart, AngleEnd, RadiusStart, RadiusEnd, Width, Height, Interpolation : )
参数说明:
PolarImage(input_object)(multichannel-)image(-array)→object(byte * / int2 * / uint2 * / real *)*允许用于计算设备
输入图像。
XYTransImage(output_object)(多通道)图像(-array)→对象(字节/ int2 / uint2 /实数)
输出图像。
Row(input_control)编号→(实数/整数)
圆弧中心的行坐标。
默认值:256
建议值:0、16、32、64、128、240、256、480、512
典型值范围:0≤行≤32767
Column(input_control)号→(实数/整数)
圆弧中心的列坐标。
默认值:256
建议值:0、16、32、64、128、256、320、512、640
典型值范围:0≤列≤32767
AngleStart(input_control)数字→(实数)
将输入图像的第一列映射到的射线角度。
默认值:0.0
建议值:0.0,0.78539816,1.57079632,3.141592654,6.2831853
AngleEnd(input_control)数字→(实数)
将输入图像的最后一列映射到的射线角度。
默认值:6.2831853
建议值:0.0,0.78539816,1.57079632,3.141592654,6.2831853
RadiusStart(input_control)数字→(实数/整数)
要将输入图像的第一行映射到的圆的半径。
默认值:0
建议值:0、16、32、64、100、128、256、512
典型值范围:0≤RadiusStart
RadiusEnd(input_control)数字→(实数/整数)
要将输入图像的最后一行映射到的圆的半径。
默认值:100
建议值:0、16、32、64、100、128、256、512
典型值范围:0≤RadiusEnd
Width(input_control)数→(整数)
输出图像的宽度。
默认值:512
建议值:256、320、512、640、800、1024
典型值范围:0≤宽度≤32767
Height(input_control)数→(整数)
输出图像的高度。
默认值:512
建议值:240、256、480、512、600、1024
典型值范围:0≤高度≤32767
Interpolation (input_control)字符串→(string)
内插法进行变换。
默认值:“ nearest_neighbor”
值列表:‘bilinear’,‘nearest_neighbor’

圆环类缺陷检测思路与步骤

1. 使用Blob分析确定圆心位置与圆环半径、变换起始终止的角度。
2. 使用XLD轮廓拟合对圆心等参数进行精确定位。(此步骤用于精确定位,有的检测不需要)
3. 进行极坐标变换
4. 对极坐标变换后的图像进行处理
5. 进行反极坐标变换
6. 显示缺陷区域

Halcon实例

inspect_bottle_mouth.hdev

实例简介

*此示例检查瓶口是否有缺陷。

程序解读

传送门,点击下方蓝色字体跳转到解读文章或者复制下方链接到浏览器。
HALCON示例程序inspect_bottle_mouth.hdev玻璃瓶口缺陷检测
https://editor.csdn.net/md/?articleId=94733605

思路剖析

*首先,检测瓶子的基本形态,
*边缘检测和圆拟合。
*然后,通过极坐标变换对颈部区域进行变换。
*之后,在变换后的图像中使用动态阈值
*检测缺陷。 最后,显示结果。

应用实例1

项目介绍


要求:检测边缘的三个红色圈圈内的缺陷。
原图

处理程序

read_image (Image, 'C:/Users/Administrator/Desktop/1.png')
rgb3_to_gray (Image, Image, Image, ImageGray)
dev_open_window_fit_image (ImageGray, 0, 0, -1, -1, WindowHandle)
dev_set_draw ('margin')
dev_set_line_width (3)
dev_set_draw ('margin')
* dev_set_draw ('fill')
get_image_size (ImageGray, Width, Height)
binary_threshold (GrayImage, Region, 'max_separability', 'dark', UsedThreshold)
connection (Region, ConnectedRegions)
select_shape_std (ConnectedRegions, SelectedRegions, 'max_area', 70)
smallest_circle (SelectedRegions, Row2, Column2, Radius)
gen_circle (Circle, Row2, Column2, Radius)
reduce_domain (ImageGray, Circle, ImageReduced2)
gray_closing_rect (ImageReduced2, ImageClosing1, 10, 4)
polar_trans_image_ext (ImageClosing1, PolarTransImage1, Row2, Column2, 0, 6.28319, Radius-100, Radius-10, 6.28*Radius, 90, 'nearest_neighbor')
mean_image (PolarTransImage1, ImageMean1, 500, 2)
dyn_threshold (PolarTransImage1, ImageMean1, RegionDynThresh1, 10, 'dark')
connection (RegionDynThresh1, ConnectedRegions1)
select_shape (ConnectedRegions1, SelectedRegions1, 'area', 'and',100, 9000000)
union1 (SelectedRegions1, RegionUnion)
closing_rectangle1 (RegionUnion, RegionClosing1, 10, 20)
connection (RegionClosing1, ConnectedRegions3)
opening_rectangle1 (ConnectedRegions3, RegionOpening1, 10, 20)
polar_trans_region_inv (RegionOpening1, XYTransRegion1, Row2, Column2, 0, 6.28319, Radius-100, Radius-10, 6.28*Radius, 90, Width, Height, 'nearest_neighbor')
smallest_circle (XYTransRegion1, Row, Column, Radius1)
gen_circle (Circle1, Row, Column, Radius1)
dev_display (ImageGray)
dev_display (Circle1)

处理效果

应用实例2

项目介绍


要求:如图所示,该图为需要找出红色圆圈内焊点的位置 。
原图

处理程序

read_image (Image, 'C:/Users/Administrator/Desktop/实际图_副本.bmp')
rgb3_to_gray (Image, Image, Image, ImageGray)
dev_open_window_fit_image (ImageGray, 0, 0, -1, -1, WindowHandle)
dev_set_draw ('margin')
dev_set_line_width (5)
get_image_size (ImageGray, Width, Height)
auto_threshold (ImageGray, Regions, 2)
count_obj (Regions, Number)
select_obj (Regions, ObjectSelected, Number)
fill_up (ObjectSelected, RegionFillUp1)
connection (RegionFillUp1, ConnectedRegions1)
select_shape_std (ConnectedRegions1, SelectedRegions1, 'max_area', 70)
smallest_circle (SelectedRegions1, Row2, Column2, Radius)
gen_circle (Circle, Row2, Column2, Radius)
reduce_domain (ImageGray, Circle, ImageReduced2)
polar_trans_image_ext (ImageReduced2, PolarTransImage1, Row2, Column2, 0, 6.28319, Radius-210, Radius, 6.28*Radius, 210, 'nearest_neighbor')
mean_image (PolarTransImage1, ImageMean1, 200, 5)
dyn_threshold (PolarTransImage1, ImageMean1, RegionDynThresh1, 45, 'dark')
closing_circle (RegionDynThresh1, RegionClosing, 15.5)
connection (RegionClosing, ConnectedRegions2)
select_shape (ConnectedRegions2, SelectedRegions, ['width','height'], 'and', [380,80], [500,160])
polar_trans_region_inv (SelectedRegions, XYTransRegion1, Row2, Column2, 0, 6.28319, Radius-210, Radius, 6.28*Radius, 210, Width, Height, 'nearest_neighbor')
smallest_rectangle2 (XYTransRegion1, Row3, Column3, Phi, Length1, Length2)
gen_rectangle2 (Rectangle, Row3, Column3, Phi, Length1, Length2)
dev_display (ImageGray)
dev_display (Rectangle)

处理效果


参考文献:
https://blog.csdn.net/guduruyu/article/details/65436931

halcon 圆环类缺陷检测的一种方法(极坐标变换法)相关推荐

  1. 基于Halcon学习的缺陷检测【四】光伏电池片的指纹以及划痕检测【第一种方法】

    此例子主要是为了把光伏电池片的指纹以及划痕标注出来.  总代码: *读取图片 read_image (Image, 'E:/研究生学习/电池片练习/手指印/截图.png') *清除窗口 dev_cle ...

  2. 基于Halcon学习的缺陷检测【五】光伏电池片的指纹以及划痕检测【第二种方法】

     此例子主要是为了把光伏电池片的指纹以及划痕标注出来. 总代码:  *读取图片 read_image (Image, 'E:/研究生学习/电池片练习/手指印/截图.png')*清除窗口 dev_cle ...

  3. 弹性理论法研究桩基受力计算公式_收藏!桩基检测的7种方法

    来源:网络 版权归原作者所有,侵删 桩基检测,分为桩基施工前和施工后的检测:施工前,为设计提供依据的试验桩检测,主要确定单桩极限承载力:施工后,为验收提供提供依据的工程桩检测,主要进行单桩承载力和桩身 ...

  4. c++学习笔记之基础---类内声明函数后在类外定义的一种方法

    在C++的"类"中经常遇到这样的函数, 返回值类型名 类名::函数成员名(参数表){ 函数体.} 双冒号的作用 ::域名解析符!返回值类型名 类名::函数成员名(参数表) { 函数 ...

  5. php类3个属性是哪3种,PHP获取类私有属性的3种方法

    今天在推上看到一条获取php类私有属性的推文,感觉很有意思: 顺着推文联想,还有其他方式吗?经过自己的测试及网上答案,总结出三种方法: 1. 反射 反射可以获取类的详细信息,要获取私有属性的值,只需将 ...

  6. Qt5.9一个简单的多线程实例(类QThread)(第一种方法)

    Qt开启多线程,主要用到类QThread.有两种方法,第一种用一个类继承QThread,然后重新改写虚函数run().当要开启新线程时,只需要实例该类,然后调用函数start(),就可以开启一条多线程 ...

  7. python描述符魔术方法_学习笔记-Python基础9-面向对象编程OOP-类的成员描述符(property)、类的常用内置属性、类的常用魔术方法、类和对象的三种方法...

    一.类的成员描述符(property) 类的成员描述符是为了在类中,对类的成员属性进行相关操作而创建的一种方式,大部分属于数据清洗 属性有三种操作:get获取属性值.set修改或添加属性.delete ...

  8. 【短信发送】实现腾讯云发送短信功能--工具类和SpringBoot配置两种方法实现

    实现腾讯云发送短信功能--工具类和SpringBoot配置两种方法实现 一.开通腾讯云短信服务 二.工具类--使用qcloudsms实现短信发送 三.Spring Boot项目引入短信发送功能 我们发 ...

  9. 多元高斯分布异常检测代码_数据科学 | 异常检测的N种方法,阿里工程师都盘出来了...

    ↑↑↑↑↑点击上方蓝色字关注我们! 『运筹OR帷幄』转载 作者:黎伟斌.胡熠.王皓 编者按: 异常检测在信用反欺诈,广告投放,工业质检等领域中有着广泛的应用,同时也是数据分析的重要方法之一.随着数据量 ...

最新文章

  1. linux用卸载软件管理,Linux下软件的安装卸载管理
  2. unity 给图片边缘_Unity Shader 屏幕后效果——边缘检测
  3. 蜗牛慢慢爬 LeetCode 6. ZigZag Conversion [Difficulty: Medium]
  4. PIC单片机精通_串口通讯与串口调试实例
  5. Python学到什么程度才可以去找工作?
  6. 正则提取字符串-python
  7. nhibernate连接11g数据库
  8. (6)ISE14.7生成bit文件报错解决(FPGA不积跬步101)
  9. poj1200 Crazy Search(hash)
  10. 如何去掉windows2003的自动锁定(每离开一会都会出现这个界面,不想让它出现)...
  11. Hadoop学习目录导航
  12. Kali系统安装Visual Studio Code
  13. 惊爆:Alexa 全球排名网站即将关闭
  14. ES设置用户名和密码
  15. 冯诺依曼 计算机名言,冯·诺依曼名言
  16. Unity2017 经典游戏开发教程 算法分析与实现 (张帆 著)
  17. 软件测试环境的搭建及详解
  18. 关于高压线路如何防山火
  19. APP绕过模拟器-小白版
  20. OpenGL ES 2.0 for Android教程(六):进入第三维

热门文章

  1. jquery检测浏览器类型
  2. html表单中get与post之间的区别
  3. 大摩维持浩大游戏“增持”评级
  4. 我想和你一起去这样一个地方
  5. js(Dom+Bom)第四天(1)
  6. jquery纯数字验证
  7. Bitmap recycle()
  8. 【转载】Linux下有趣的命令
  9. Win7中IIS7.0安装及ASP环境配置
  10. span里面插入文字