**这个程序说明如何在一个不均匀的照明表面通过滤波在频域检测缺陷(划痕)。
*首先,创建一个合适的带通滤波器。
*然后对输入图像进行傅里叶变换,在频域进行滤波,增强高频信息。
*最后将其转换回空间域,对增强后的缺陷进行形态学后处理。
*
*
dev_update_off ()
dev_close_window ()
*‘surface_scratch’
read_image (Image, ‘C:/Users/连山人/Desktop/que/que01’)
invert_image (Image, ImageInverted)
*反转一个图像。
get_image_size (Image, Width, Height)
dev_open_window (0, 0, Width, Height, ‘black’, WindowHandle)
set_display_font (WindowHandle, 16, ‘mono’, ‘true’, ‘false’)
dev_display (Image)
*在当前图形窗口中显示图像对象(Image)。
*
-
优化快速傅里叶变换的速度
-
Message := ‘Optimize the speed of the fast fourier transform.’
-
Message[1] := ‘Please wait…’
-
disp_message (WindowHandle, Message, ‘window’, 12, 12, ‘black’, ‘true’)
-
optimize_rft_speed (Width, Height, ‘standard’)
-
disp_continue_message (WindowHandle, ‘black’, ‘true’)
-
stop ()
-
通过频域滤波增强刮痕
gen_sin_bandpass (ImageBandpass, 0.4, ‘none’, ‘rft’, Width, Height)
*生成一个正弦形状的带通滤波器。带通滤波器(ImageBandpass)从直流项到滤波器最大值的距离(0.4)。
*滤波器的归一化因子(‘none’) 直流项在频域中的位置(‘rft’) 图像的宽度(滤镜)。
rft_generic (ImageInverted, ImageFFT, ‘to_freq’, ‘none’, ‘complex’, Width)
*对图片快速傅里叶变换。参数:输入的图片(ImageInverted)傅里叶变换后输出的图片(ImageFFT)
*变换正方向(’to_freq’或’from_freq’)变换因子的规范(’none’)输出图片的数据类型(’复合’)图片的宽(Width)
convol_fft (ImageFFT, ImageBandpass, ImageConvol)
*滤波器对图像进行卷积。:输入的图片(ImageFFT)频域滤波器(ImageBandpass)卷积结果(ImageConvol)
rft_generic (ImageConvol, Lines, ‘from_freq’, ‘n’, ‘byte’, Width) -
*对滤波后的图片进行傅里叶反变换。参数:输入的图片(ImageConvol)运算后结果(Lines)变换反方向(’from_freq’)
-
利用形态学对划痕进行分割
threshold (Lines, Region, 5, 255)
*利用全局阈值算子分割图像。参数:输入的图片(Lines)分割后得到的区域(Region)
*阈值(MinGray=5,MaxGray=255)分割后图像灰度范围:MinGray <= RegionDynThresh <= MaxGray
connection (Region, ConnectedRegions)
*连通选中部分。参数:输入的图片(Region)得到的连通区域(ConnectedRegions)
select_shape (ConnectedRegions, SelectedRegions, ‘area’, ‘and’, 5, 5000)
*根据指定的形态特征选择区域。参数:输入的图片(ConnectedRegions)满足条件的区域(SelectedRegions)
*将要计算的形态特征(’area’)独立特征间的连接关系(’and’)特征的最小限制(5)特征的最大限制(99999)
dilation_circle (SelectedRegions, RegionDilation, 5.5)
*用圆扩展区域。待扩展的区域(SelectedRegions)扩展后区域(RegionDilation)循环结构元素的半径(5.5)。
union1 (RegionDilation, RegionUnion)
*返回包含所有瑕疵区域的集合。参数:待计算区域的图片(RegionDilation)所有输入区域集合(RegionUnion)
reduce_domain (Image, RegionUnion, ImageReduced)
*缩小图像的区域。输入图像(Image)新定义的域(RegionUnion)图像中交集域(ImageReduced)
lines_gauss (ImageReduced, LinesXLD, 0.8, 3, 5, ‘dark’, ‘false’, ‘bar-shaped’, ‘false’)
*检测线条及其宽度。输入图像(ImageReduced)提取行(LinesXLD)应用平滑量(0.8)滞后阈值操作下上阈值(Low, High)
*提取亮线或暗线(‘dark’)是否提取线宽(’‘false’’)用于修正线的位置和宽度的线模型(‘bar-shaped’)是否在不能提取的地方添加连接(‘false’)
union_collinear_contours_xld (LinesXLD, UnionContours, 40, 3, 3, 0.2, ‘attr_keep’)
*连接近似一条直线轮廓。输入XLD轮廓。输出XLD轮廓。待连接两等值线间的最大差距40。两条等高线的回归线之间的最大角度0.2
*轮廓属性处理的模式(保留)
select_shape_xld (UnionContours, SelectedXLD, ‘contlength’, ‘and’, 15, 1000)
**根据指定的形态特征选择区域。输入的区域(UnionContours)满足条件的区域(SelectedXLD)
*将要计算的形态特征(连续的长度)独立特征间的连接关系(’and’)特征的最小限制(15)特征的最大限制(1000)
gen_region_contour_xld (SelectedXLD, RegionXLD, ‘filled’)
*根据缺陷轮廓创建区域。缺陷区域(SelectedXLD)创建的区域(RegionXLD)填充模式(充满)
union1 (RegionXLD, RegionUnion)
*区域的集合。参数:待计算区域(RegionXLD)所有输入区域集合(RegionUnion)
dilation_circle (RegionUnion, RegionScratches, 10.5)
*红色圆覆盖划痕,凸显出来,为下一步圈出做准备
*用圆形结构元素扩展区域。待扩展的区域(RegionUnion)扩展后区域(RegionScratches)循环结构元素的半径(10.5)。 -
显示结果
dev_set_draw (‘margin’)
*将上一步圆圈覆盖的区域进一步处理,只显示覆盖区域的边缘轮廓
*定义区域填充模式(边缘)
dev_set_line_width (3)
*设置圆圈线宽
dev_set_colored (12)
*设置多个输出颜色。
dev_display (Image)
*在当前图形窗口中显示原图像对象
dev_display (RegionScratches)
*在当前图形窗口原图像中显示缺陷对象对象