```
dev_update_off()
* 参数定义
GaussSize := 5
ScratchLengthMin := 30
StainAreaMin := 50
* 获取图像文件列表
ImageFolder := 'E:/毕业论文/瓶盖图/'
list_files(ImageFolder, ['files','follow_links'], ImageFiles)
tuple_regexp_select(ImageFiles, ['\\.(tif|tiff|gif|bmp|jpg|jpeg|jp2|png|pcx|pgm|ppm|pbm|xwd|ima|hobj)$','ignore_case'], ImageFiles)
* 创建日志文件
open_file('defect_log.txt', 'output', FileHandle)
* 主循环
for ImgIndex := 0 to |ImageFiles| - 1 by 1
* 窗口管理
dev_close_window()
dev_open_window(0, 0, 600, 400, 'black', WindowHandle)
* 文件读取(带异常捕获)
try
read_image(Image, ImageFiles[ImgIndex])
catch (Exception)
write_string(FileHandle, 'Failed:'+ImageFiles[ImgIndex]+'\n')
continue
endtry
get_image_size (Image, Width, Height)
dev_open_window (0, 0, 600, 400, 'black', WindowHandle)
set_display_font (WindowHandle, 16, 'mono', 'true', 'false')
dev_set_draw ('margin')
dev_set_line_width (2)
* 1. 图像预处理(保留V通道信息)
try
decompose3 (Image, R, G, B)
trans_from_rgb (R, G, B, H, S, V, 'hsv')
gauss_filter (V, VFiltered, GaussSize)
catch (Exception)
disp_message (WindowHandle, '预处理错误', 'window', 12, 12, 'red', 'true')
stop()
endtry
* 2. 瓶盖区域定位
binary_threshold (VFiltered, Regions, 'max_separability', 'dark', UsedThreshold)
closing_circle (Regions, RegionClosing, 5.5)
connection (RegionClosing, ConnectedRegions)
ImageArea := Width * Height
MinArea := 0.3 * ImageArea
MaxArea := 0.9 * ImageArea
select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', MinArea, MaxArea)
select_shape (SelectedRegions, CapCandidates, ['circularity','compactness'], 'and', [0.6,0.5], [1,1])
fill_up (CapCandidates, RegionFillUp)
shape_trans (RegionFillUp, CapRegion, 'convex')
* 3. 缺陷检测流程
* 3.1 划痕检测
reduce_domain (VFiltered, CapRegion, VReduced)
equ_histo_image (VReduced, VEquHist)
edges_sub_pix (VEquHist, Edges, 'canny', 0.5, 15, 25)
select_shape_xld (Edges, Scratches, ['contlength','width'], 'and', [ScratchLengthMin,1], [9999,3])
gen_region_contour_xld (Scratches, ScratchesRegion, 'filled')
* 3.2 污渍检测
mean_image (VReduced, ImageMean, 31, 31)
dyn_threshold (VReduced, ImageMean, Stains, 15, 'dark')
connection (Stains, ConnectedStains)
select_shape (ConnectedStains, SelectedStains, ['area','compactness'], 'and', [StainAreaMin,0.2], [9999,1.5])
* 4. 合并缺陷区域
gen_empty_obj (AllDefects)
union2 (ScratchesRegion, SelectedStains, AllDefects)
* 5. 后处理
connection (AllDefects, ConnectedDefects)
closing_circle(ConnectedDefects, FinalDefects, 1.5)
* 6. 结果显示
count_obj (FinalDefects, NumDefects) // 此时NumDefects会被正确初始化
dev_display (Image)
dev_set_color ('green')
dev_display (CapRegion)
if (NumDefects > 0)
* 划痕显示(蓝色)
dev_set_color ('blue')
dev_display (ScratchesRegion)
* 污渍显示(紫色)
dev_set_color ('magenta')
dev_display (SelectedStains)
* 添加图例说明
disp_message (WindowHandle, '检测结果:', 'window', 12, 12, 'white', 'true')
disp_message (WindowHandle, '蓝色:划痕缺陷', 'window', 40, 12, 'blue', 'true')
disp_message (WindowHandle, '紫色:污渍缺陷', 'window', 60, 12, 'magenta', 'true')
else
disp_message (WindowHandle, '检测通过:无缺陷', 'window', 12, 12, 'green', 'true')
endif
endfor
*主循环结束```结果显示无缺陷,但过程识别到了划痕污渍