Halcon 环形检测(瓶口缺陷检测)

本文介绍了一种用于检测瓶口缺陷的图像处理算法。通过自动阈值选取、形态学操作等步骤获取瓶口圆形,并利用边缘检测和拟合技术确定瓶口外边界,最后进行缺陷检测及筛选。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

图片资源文件:
链接:https://pan.baidu.com/s/1WETQA8UEp21D8kI6IJI2ig
提取码:o9ld
在这里插入图片描述
主程序代码:

************1、初始化变量****************
* 均值滤波参数
SmoothX := 501

ThresholdOffset := 25
MinDefectSize := 50

* 坐标系转换后图片尺寸
PolarResolution := 640 
* 环形尺寸
RingSize := 70

************2、参数设置****************
get_system ('store_empty_region', StoreEmptyRegion)
set_system ('store_empty_region', 'false')
dev_update_off ()
dev_close_window ()
dev_close_window ()

************3、显示第一张图片****************
read_image (Image, 'img/bottle_mouth_01')

dev_open_window_fit_image (Image, 0, 0, -1, -1, WindowHandle)
set_display_font (WindowHandle, 16, 'mono', 'true', 'false')
dev_display (Image)
dev_set_draw ('margin')
dev_set_line_width (3)


************4、垂直图***********************
dev_open_window_fit_size (0, 648, RingSize, PolarResolution, 150, 512, WindowHandle1)
dev_set_draw ('margin')
dev_set_line_width (3)
dev_set_color ('red')

dev_set_window (WindowHandle)

************5、循环处理图片****************
for Index:=2 to 16 by 1
    read_image (Image, 'img/bottle_mouth_' + Index$'.02')
    get_circle_defect (Image, WindowHandle, WindowHandle1, \
                       RingSize, PolarResolution, SmoothX)
    if (Index<16)
        disp_continue_message (WindowHandle, 'black', 'true')
        stop ()
    endif
    
endfor
get_system ('store_empty_region', StoreEmptyRegion)

图片处理

在这里插入图片描述

dev_display (Image)
***********1、获取瓶口圆形****************************
* 自动阈值
auto_threshold (Image, Regions, 2)
* 选中瓶口区域
select_obj (Regions, DarkRegion, 1)
* 开运算
opening_circle (DarkRegion, RegionOpening, 3.5)
* 闭运算
closing_circle (RegionOpening, RegionClosing, 25.5)

***********2、截取瓶口外边界图片***************************
* 填充瓶口区域
fill_up (RegionClosing, RegionFillUp)
* 获取外边界
boundary (RegionFillUp, RegionBorder, 'outer')
* 外边界膨胀运算
dilation_circle (RegionBorder, RegionDilation, 3.5)
* 获取外边界区域图片
reduce_domain (Image, RegionDilation, ImageReduced)

***********3、外边界边缘检测 选择最长的圆形****************************
* 边缘检测
edges_sub_pix (ImageReduced, Edges, 'canny', 0.5, 20, 40)
* 分割先与圆形
segment_contours_xld (Edges, ContoursSplit, 'lines_circles', 5, 4, 2)
* 联合连通域
union_cocircular_contours_xld (ContoursSplit, UnionContours, \
                               0.9, 0.5, 0.5, 200, 50, 50, 'true', 1)
* 计算连通域长度
length_xld (UnionContours, Length)
* 选择最长的连通域
select_obj (UnionContours, LongestContour, sort_index(Length)[|Length|-1]+1)

***********4、拟合成圆形****************************
* 拟合成圆形
fit_circle_contour_xld (LongestContour, 'ahuber', -1, 0, 0, 3, 2, Row, Column, Radius, StartPhi, EndPhi, PointOrder)
* 绘制圆形
gen_circle (Circle, Row, Column, Radius)

***********5、获取图片环形****************************
* 膨胀
dilation_circle (Circle, RegionDilation, 5)
* 收缩
erosion_circle (Circle, RegionErosion, RingSize-5)
* 环形mask
difference (RegionDilation, RegionErosion, RegionDifference)
* 截取环形图片
reduce_domain (Image, RegionDifference, ImageRing)

***********6、直角坐标系转换成极坐标系*******************
* 坐标系转换
polar_trans_image(ImageRing, ImagePolar, Row, Column, PolarResolution, Radius+5)
* 剪切矩形
crop_part (ImagePolar, ImagePart, Radius-RingSize, 0, PolarResolution, RingSize)
* 灰度范围修改
scale_image_max (ImagePart, ImageScaleMax)
* 强力水平均值滤波
mean_image (ImageScaleMax, ImageMean, SmoothX, 3)

***********7、缺陷的计算与筛选*******************
* 局部阈值处理(不同的差值) 与均值滤波图片对比
dyn_threshold (ImageScaleMax, ImageMean, Regions1, 50, 'not_equal')
* 连通分析
connection (Regions1, Connection)
* 过滤缺陷(9以上的区域)
select_shape (Connection, SelectedRegions, 'height', 'and', 9, 99999)
* 闭运算(矩形)
closing_rectangle1 (SelectedRegions, RegionClosing1, 10, 20)
* 连接连通域
union1 (RegionClosing1, RegionUnion)

***********8、缺陷连通域转换成直角坐标系*******************
* 缺陷转换成
polar_trans_region_inv (RegionUnion, XYTransRegion, \
                        Row, Column, 6.28319, 0, \
                        Radius-RingSize, Radius, 640, RingSize, \
                        1280, 1024, 'nearest_neighbor')

***********9、显示缺陷结果***************************
dev_set_window (WindowHandle)
dev_display (Image)
dev_set_color ('blue')
dev_display (RegionDifference)
dev_set_color ('red')
dev_display (XYTransRegion)
count_obj (RegionUnion, Number)

if (Number > 0)
    disp_message (WindowHandle, 'NG', 'window', -1, -1, 'red', 'false')
else
    disp_message (WindowHandle, 'OK', 'window', -1, -1, 'green', 'false')    
endif

***********10、显示垂直缺陷结果***************************
dev_set_window (WindowHandle1)
* 旋转图片90度
rotate_image (ImagePart, ImageRotate, 90, 'constant')

if (Number > 0)
    * 对角线镜像
    mirror_region (RegionUnion, RegionMirror, 'diagonal', PolarResolution)
    * 水平镜像
    mirror_region (RegionMirror, RegionMirror, 'row', PolarResolution)
    
    dev_display (ImageRotate)
    dev_display (RegionMirror)

dev_set_window (WindowHandle)
return ()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

廷益--飞鸟

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

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

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

打赏作者

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

抵扣说明:

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

余额充值