图片资源文件:
链接: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 ()