本程序演示了如何通过频域滤波检测非均匀照明表面的缺陷(划痕)。
首先,创建一个合适的带通滤波器。然后对输入图像进行傅里叶变换,在频域中进行滤波,增强高频信息。最后将其转化为空间域,对增强后的缺陷进行形态学后处理。
* 关闭更新
dev_update_off ()
dev_close_window ()
* 读取图像
read_image (Image, 'surface_scratch')
* 图像反转
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)
*
* 优化快速傅里叶变换的速度
* 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)
* 快速傅里叶变换
rft_generic (ImageInverted, ImageFFT, 'to_freq', 'none', 'complex', Width)
* 图像卷积
convol_fft (ImageFFT, ImageBandpass, ImageConvol)
* 快速傅里叶变换,转换图像到空间域及byte类型
rft_generic (ImageConvol, Lines, 'from_freq', 'n', 'byte', Width)
*
* 通过形态学实现划伤分割
threshold (Lines, Region, 5, 255)
connection (Region, ConnectedRegions)
select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 5, 5000)
dilation_circle (SelectedRegions, RegionDilation, 5.5)
union1 (RegionDilation, RegionUnion)
reduce_domain (Image, RegionUnion, ImageReduced)
lines_gauss (ImageReduced, LinesXLD, 0.8, 3, 5, 'dark', 'false', 'bar-shaped', 'false')
union_collinear_contours_xld (LinesXLD, UnionContours, 40, 3, 3, 0.2, 'attr_keep')
select_shape_xld (UnionContours, SelectedXLD, 'contlength', 'and', 15, 1000)
gen_region_contour_xld (SelectedXLD, RegionXLD, 'filled')
union1 (RegionXLD, RegionUnion)
dilation_circle (RegionUnion, RegionScratches, 10.5)
*
* Display the results
dev_set_draw ('margin')
dev_set_line_width (3)
dev_set_colored (12)
dev_display (Image)
dev_display (RegionScratches)
3、算子
invert_image(Image : ImageInvert : : )对图像进行反转
gen_sin_bandpass( : ImageFilter : Frequency, Norm, Mode, Width, Height : )生成正弦带通滤波器
该函数生成一个在频率域具有旋转不变性的正弦带通滤波器。该sin函数的最大值由Frequency决定。Norm指定滤波归一化的参数,以实现滤波效率的最大化。fft_generic和Norm = ‘n’ 的应用,FFT将避免归一化。Mode用来确定滤波器中的DC项或者是否应该在实数值FFT中应用滤波。若应用 fft_generic ,‘dc_edge’ 将有更好的效率。若应用fft_image 和fft_image_inv进行滤波,则必须应用Norm = ‘none’ 和Mode =‘dc_center’ 。若应用rft_generic ,则Mode必须为Mode = ‘rft’。滤波值,对于DC项始终为0,在sin函数值达到Frequency前一直增加,当高于Frequency时下降。sin函数值范围为0到pi。其他点都设置为0.(该段为自己翻译,若有误或理解不透,请留言指正!谢谢
connection(Region : ConnectedRegions : : )计算区域的连通域
例:
read_image(Image,'clip')
dev_set_colored(12)
threshold(Image,Dark,0,150)
count_obj(Dark,NumThresholded)
dev_display (Dark)
connection(Dark,ConnectedRegions)
count_obj(ConnectedRegions,NumConnected)
dev_display (ConnectedRegions)
lines_gauss(Image : Lines : Sigma, Low, High, LightDark, ExtractWidth, LineModel, CompleteJunctions : )计算直线及其宽度
union_collinear_contours_xld(Contours : UnionContours : MaxDistAbs, MaxDistRel, MaxShift, MaxAngle, Mode : )合并近似共线的直线
select_shape_xld(XLD : SelectedXLD : Features, Operation, Min, Max : )根据特征选取亚像素进度的轮廓
gen_region_contour_xld(Contour : Region : Mode : )由亚像素精度的轮廓生成区域
4、参考
Halcon官方帮助文档
---------------------
作者:Y忍冬草
来源:CSDN
原文:https://blog.csdn.net/y363703390/article/details/82454045
版权声明:本文为博主原创文章,转载请附上博文链接!