图像处理报告
1.基本信息
姓名:NCUTer
日期:2022.9.17
处理图像名称:5.凹凸偏位检测
编程语言及第三方图像处理库:Halcon图像处理库
- 图像处理流程(含用到的算子及中间结果图)读取图像
1.read_image (Image, ImageFiles[I])
2.图像二值阈值化(otsu法)
binary_threshold (Image, Region, 'max_separability', 'light', UsedThreshold)
3.形态学提取圆形工件区域并进行区域形状转换生成RegionTrans区域
closing_circle (Region, RegionClosing, 3.5)
fill_up_shape (RegionClosing, RegionFillUp, 'area', 1, 300)
opening_circle (RegionFillUp, RegionOpening, 43.5)
shape_trans (RegionOpening, RegionTrans, 'circle')
4.结合上述提取区域的中心坐标位置相对左侧字符区域位置构建矩形ROI[采取工件内部缺陷区域和外部缺陷区域分开提取的思路]
gen_rectangle1 (ROI_0, 10, Column1-180, 350, Column1-145.5)
5.将RegionTrans区域与矩形ROI区域合并生成RegionUnion
union2 (RegionTrans, ROI_0, RegionUnion)
6.获取RegionUnion合并区域的补集RegionComplement
complement (RegionUnion, RegionComplement)
7.利用补集RegionComplement在原图上抠图得到图像ImageReduced,以去除工件和字符对缺陷提取的干扰
reduce_domain (Image, RegionComplement, ImageReduced)
8.先进行圆形工件区域外部的缺陷检测
8.1对ImageReduced傅里叶变换,由空间域-->频域,进行高斯滤波
get_image_size (Image, Width, Height)
fft_generic (ImageReduced, ImageFFT, 'to_freq', -1, 'none', 'dc_center', 'complex')
*构建一个高斯滤波
gen_gauss_filter (ImageGauss, 3, 3, 0, 'n', 'dc_center', Width, Height)
*处理图像
convol_fft (ImageFFT, ImageGauss, ImageConvol)
8.2 滤波之后从频域-->空间域,生成图像ImageFFT
*从频域变换到空间域
fft_generic (ImageConvol, ImageFFT1, 'from_freq', 1, 'none', 'dc_center', 'byte')
8.3 由原图ImageReduced与变换后图像ImageFFT进行图像差分,生成图像ImageSub
*差分图像,得到新的图像
sub_image (ImageReduced, ImageFFT1, ImageSub, 1, 100)
8.4 对ImageSub进行高斯线条提取
lines_gauss(ImageReduced,Lines,1.5,3,8,'dark','true', 'bar-shaped', 'true')
8.5 对提取的xld轮廓进行特征筛选与合并,即可完成圆形工件区域外部的缺陷检测。
select_shape_xld (Lines, SelectedXLD, 'ratio', 'and', 0.15, 10)
union_adjacent_contours_xld (SelectedXLD, UnionContours, 4, 1, 'attr_keep')
select_shape_xld (UnionContours, SelectedXLD1, ['column','contlength'], 'and', [60,30], [250,200])
9 再进行圆形工件区域内部的缺陷检测
9.1转换后的圆形工件区域在原图上抠图(单独检测工件内部缺陷)
reduce_domain (Image, RegionTrans, ImageYGJ)
9.2 图像灰度缩放增强预处理(增强缺陷处对比度)
scale_image (ImageYGJ, ImageScaled, 2.00787, 0)
9.3 阈值分割并提取骨架Skeleton
threshold (ImageScaled, Regions, 0, 120)
skeleton (Regions, Skeleton)
9.4 由Skeleton生成xld轮廓并将其相近的彼此连接
gen_contours_skeleton_xld (Skeleton, Contours, 1, 'filter')
union_adjacent_contours_xld (Contours, UnionContours, 6, 1, 'attr_keep')
9.5 对xld特征筛选分离出缺陷区域,并将圆形工件内外部缺陷区域一起放入QX数组
select_shape_xld (UnionContours, SelectedXLD, ['column','contlength','ratio','area'], 'and', [155,40,0.1,90], [180,150,0.35,350])
concat_obj (QX, SelectedXLD, QX)
union_adjacent_contours_xld (QX, QX, 15, 2, 'attr_keep')
9.6 计算缺陷区域面积并统计缺陷个数,最终显示检测结果
area_center_points_xld (QX, AreaRef, Row, Column)
tuple_sum (AreaRef, Sum)
count_obj (QX, Number)
*结果显示环节
*若Number>0,则存在缺陷;否则为OK
if (Number>0)
dev_display (Image)
dev_display (QX)
dev_disp_text ('NG\n'+'Defect_Area: '+Sum+' Pix', 'window', 6, 3, 'black', [], [])
else
dev_display (Image)
dev_disp_text ('OK', 'window', 6, 3, 'black', [], [])
endif
完整项目代码:
dev_update_off ()
dev_close_window ()
dev_open_window (0, 0, 587, 536, 'black', WindowHandle)
set_display_font (WindowHandle, 16, 'mono', 'true', 'false')
dev_set_line_width (2)
*遍历文件夹开始检测
list_image_files ('union_img', 'default', [], ImageFiles)
for I := 0 to |ImageFiles|-1 by 1
read_image (Image, ImageFiles[I])
binary_threshold (Image, Region, 'max_separability', 'light', UsedThreshold)
closing_circle (Region, RegionClosing, 3.5)
fill_up_shape (RegionClosing, RegionFillUp, 'area', 1, 300)
opening_circle (RegionFillUp, RegionOpening, 43.5)
*圆工件外与圆工件内的缺陷区域分开提取
shape_trans (RegionOpening, RegionTrans, 'circle')
area_center (RegionTrans, Area, Row1, Column1)
reduce_domain (Image, RegionTrans, ImageYGJ)
gen_empty_obj (QX)
*融合圆形工件与字符最小外接矩形区域求区域补集,以去除过多背景干扰
gen_rectangle1 (ROI_0, 10, Column1-180, 350, Column1-145.5)
union2 (RegionTrans, ROI_0, RegionUnion)
complement (RegionUnion, RegionComplement)
reduce_domain (Image, RegionComplement, ImageReduced)
*---------------------------------圆形工件区域外部缺陷检测
get_image_size (Image, Width, Height)
fft_generic (ImageReduced, ImageFFT, 'to_freq', -1, 'none', 'dc_center', 'complex')
*构建一个高斯滤波
* gen_sin_bandpass (ImageBandpass, 0.2, 'none', 'dc_center', Width, Height)
gen_gauss_filter (ImageGauss, 3, 3, 0, 'n', 'dc_center', Width, Height)
*处理图像
convol_fft (ImageFFT, ImageGauss, ImageConvol)
*从频域变换到空间域
fft_generic (ImageConvol, ImageFFT1, 'from_freq', 1, 'none', 'dc_center', 'byte')
*差分图像,得到新的图像
sub_image (ImageReduced, ImageFFT1, ImageSub, 1, 100)
lines_gauss(ImageReduced,Lines,1.5,3,8,'dark','true', 'bar-shaped', 'true')
select_shape_xld (Lines, SelectedXLD, 'ratio', 'and', 0.15, 10)
union_adjacent_contours_xld (SelectedXLD, UnionContours, 4, 1, 'attr_keep')
select_shape_xld (UnionContours, SelectedXLD1, ['column','contlength'], 'and', [60,30], [250,200])
concat_obj (QX, SelectedXLD1, QX)
*----------------------------------------圆形工件区域内部缺陷检测
scale_image (ImageYGJ, ImageScaled, 2.00787, 0)
threshold (ImageScaled, Regions, 0, 120)
skeleton (Regions, Skeleton)
gen_contours_skeleton_xld (Skeleton, Contours, 1, 'filter')
union_adjacent_contours_xld (Contours, UnionContours, 6, 1, 'attr_keep')
select_shape_xld (UnionContours, SelectedXLD, ['column','contlength','ratio','area'], 'and', [155,40,0.1,90], [180,150,0.35,350])
concat_obj (QX, SelectedXLD, QX)
union_adjacent_contours_xld (QX, QX, 15, 2, 'attr_keep')
*计算缺陷的面积
area_center_points_xld (QX, AreaRef, Row, Column)
tuple_sum (AreaRef, Sum)
count_obj (QX, Number)
*结果显示环节
*若Number>0,则存在缺陷;否则为OK
if (Number>0)
dev_display (Image)
dev_display (QX)
dev_disp_text ('NG\n'+'Defect_Area: '+Sum+' Pix', 'window', 6, 3, 'black', [], [])
else
dev_display (Image)
dev_disp_text ('OK', 'window', 6, 3, 'black', [], [])
endif
* dump_window_image (Image1, WindowHandle)
* write_image (Image1, 'bmp', 0, ImageFiles[I])
stop ()
endfor