0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

新机器视觉 来源:CSDN 2023-07-11 15:15 次阅读

简介

圆环类检测在我们日常的缺陷检测中经常遇到。比如玻璃瓶口的缺陷检测,硬币的缺陷检测,胶垫的缺陷检测…

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

极坐标变换

定义

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

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

原理

极坐标想必学过高中数学的人都听过,一般的坐标系中用(x, y)值来描述一个点的位置,而在极坐标系中,则使用到原点的距离ρ和夹角θ来描述该点的位置。

首先,正常的图像都是在直角坐标系下的,可以看做一个二维平面。我们要对图像进行坐标变换,首先要把位置转换到新的坐标系,然后将值赋过去。

这里有两个值需要确定:1.位置 2.值。即变换后任一个像素的值与位置。

这里:变幻后的值不变。即求解变幻的位置关系式。

极坐标变换及其反变换的关键在于,根据极坐标变换前的图像确定极坐标变换后的图像上每个像素点的像素值。也即是找到“圆图”和“方图”间几何坐标的对应关系。

证明:

27c1f3f2-1fa3-11ee-962d-dac502259ad0.png

如上图所示,实现极坐标变换的关键即在于找到圆图上任一点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

实例简介

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

思路剖析

*首先,检测瓶子的基本形态,

*边缘检测和圆拟合。

*然后,通过极坐标变换对颈部区域进行变换。

*之后,在变换后的图像中使用动态阈值

*检测缺陷。最后,显示结果。

应用实例1

项目介绍

27e380ee-1fa3-11ee-962d-dac502259ad0.png

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

原图:

280b7144-1fa3-11ee-962d-dac502259ad0.png

处理程序

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)

处理效果

282a5a64-1fa3-11ee-962d-dac502259ad0.png

应用实例2

项目介绍

284fe306-1fa3-11ee-962d-dac502259ad0.png

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

原图:

287b3664-1fa3-11ee-962d-dac502259ad0.jpg

处理程序

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)

处理效果

289bcd84-1fa3-11ee-962d-dac502259ad0.png


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 图像
    +关注

    关注

    2

    文章

    1064

    浏览量

    40042
  • 像素
    +关注

    关注

    1

    文章

    195

    浏览量

    18421
  • HALCON
    +关注

    关注

    16

    文章

    63

    浏览量

    27004

原文标题:halcon 圆环类缺陷检测的一种方法(极坐标变换法)

文章出处:【微信号:vision263com,微信公众号:新机器视觉】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    基于labview的极坐标控制

    用LabVIEW编制个完整应用软件,完成以下功能:1、绘制极坐标图,如下图类似效果,要求具有角度和极轴刻度;2、在极坐标图绘制心形曲线,点击按钮可计算显示曲线的3dB宽度(从最大值下降0.707
    发表于 06-23 21:56

    Labview里面使用Halcon的函数。 方法:直接调用Halcon的函数。

    本帖最后由 高顺周 于 2016-10-14 19:06 编辑 在Labview使用Halcon,有两方式。一种是创造Halcon
    发表于 08-15 14:14

    三分钟学会Altium Designer 圆弧形阵列粘贴和极坐标的使用

    需要的朋友看看。实现以上效果(其实我也不知道专业的名称叫什么)有两种方法:1、阵列粘贴的方法 2、极坐标阵列粘贴第步,画个封闭圆环(需要在
    发表于 01-13 13:48

    关于labview调用halcon程序的方法介绍

    `Labview调用Halcon有两种方法一种是调用通过halcondotnet.dll调用Halcon函数,另一种是通过hdevengi
    发表于 10-11 11:54

    LABVIEW通过C#调用halcon算子

    用VS创建库键入这些代码,点击生成解决方案,在VS的项目目录下\bin\Debug文件夹里会生成个DLL。打开LABVIEW-互联接口-.NET-构造器节点,创建个构造器然后调用方法
    发表于 02-18 10:54

    如何布局allegro极坐标

    allegro 如何用极坐标布局?
    发表于 07-02 23:05

    AD18中极坐标的添加方法

    管理器)”,点击“Add”,选择添加“Add Polar Grid(添加极坐标)”,然后按照上面的步骤2继续完成极坐标的添加。PS:因为AD18将栅格管理器这栏移到了“Properties”中,所以
    发表于 07-10 06:25

    Altium Designer 19极坐标的添加方法

    方法:1. 在“Properties”中找到“Grid Manager(栅格管理器)”,点击“Add”,选择添加“Add Polar Grid(添加极坐标)”; 2. 完成极坐标的添
    发表于 10-22 16:45

    Allegro极坐标布局方法

    下allegro极坐标布局方法!记得多余时间来撩我!!!好了废话不多说了,开始!!!首先,将网标导入PCB中(封装记得都做对)然后,快速放入器件紧接着,画个圆形,并选择个要放在圆上
    发表于 12-31 00:01

    一种先分割后分类的两阶段同步端到端缺陷检测方法

    作者:SFXiang首发:AI算法修炼营本文是一种端到端的先分割后分类的表面缺陷检测方法。主要的创新点在于如何将两任务更好地进行同步学习,
    发表于 07-24 11:01

    软件化雷达视频显示的实时坐标变换方法

    在采用软件化方法进行雷达视频图像显示实时处理中,必然会遇到直角坐标极坐标转换的问题。本文针对利用简单的数学公式进行坐标变换所存在的量化漏点
    发表于 02-22 16:02 43次下载

    matlab坐标变换

    matlab坐标变换 坐标变换 cart2pol 笛卡儿坐标变换
    发表于 06-18 14:47 2231次阅读

    频率响应法--极坐标

    频率响应法--极坐标图 
    发表于 07-27 14:26 3473次阅读

    一种基于极坐标变换的点模式匹配算法

    变换得到对数极坐标的特征图,并利用几何不变矩方法对特征图进行描述。由特征描述向量的比较,获得粗匹配结果,然后通过几何约束迭代的方法获取最终的点集匹配结果。本文贡献如下:一,构建了
    发表于 12-05 19:08 2次下载

    基于傅里叶极坐标变换的织物瑕疵检测方法

    本文研究的目的是检测不同光照下纺织工业中织布的瑕疵,不同光照下的织布图像清晰度不同,但却都非常有周期性,有方向性。所以本文提出了一种基于傅里叶极坐标变换
    发表于 12-12 18:35 1次下载