```
dev_update_off()
* 参数定义
GaussSize := 5
ScratchLengthMin := 100
StainAreaMin := 100
* 获取图像文件列表
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)
connection (Regions, ConnectedRegions)
select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 5000, 9999999)
fill_up (SelectedRegions, 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.8, 15, 25)
select_shape_xld (Edges, Scratches, ['contlength','width'], 'and', [100,1], [9999,3])
gen_region_contour_xld (Scratches, ScratchesRegion, 'filled')
* 3.2 污渍检测
texture_laws (VReduced, TextureImage, 'el', 5, 5)
var_threshold (TextureImage, Stains, 25, 25, 0.2, 1.5, 'dark')
connection (Stains, ConnectedStains)
select_shape (ConnectedStains, SelectedStains, ['area','compactness'], 'and', [100,0.1], [9999,0.7])
* 4. 合并缺陷区域
union2 (ScratchesRegion, SelectedStains, AllDefects)
* 5. 后处理
connection (AllDefects, ConnectedDefects)
opening_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
*主循环结束```该代码检测出来的都是无缺陷的,为什么检测不出来瓶盖商标的划痕与污渍