原图:
halcon程序:
read_image (Image, 'C:/Users/Administrator/Desktop/划痕+油污+瑕疵的检测/划痕、油污、瑕疵/表面划痕/Image.bmp') dev_close_window() get_image_size(Image, Width, Height) dev_open_window(0, 0, Width, Height, 'black', WindowHandle) set_display_font(WindowHandle, 16, 'mono', 'true', 'false') dev_set_line_width(2) dev_display(Image) disp_continue_message(WindowHandle, 'black', 'true') stop() invert_image(Image,ImageInvert1) mult_image(ImageInvert1, ImageInvert1, ImageResult,0.01, 0) * Generate a bandpass filter with sinusoidal shape. gen_sin_bandpass (ImageBandpass, 0.6, 'none', 'rft', Width, Height) rft_generic (ImageResult, ImageFFT, 'to_freq', 'none', 'complex', Width) convol_fft (ImageFFT, ImageBandpass, ImageConvol) rft_generic (ImageConvol, Lines, 'from_freq', 'n', 'byte', Width) *Filter an image using a Laws texture filter. texture_laws (Lines, ImageTexture, 'el',3, 5) mean_image(ImageTexture, ImageMean,5, 30) dyn_threshold(ImageTexture, ImageMean, RegionDynThresh, 20, 'light') connection(RegionDynThresh, ConnectedRegions) select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 44.08, 487) union1(SelectedRegions, RegionUnion) closing_circle(RegionUnion, RegionClosing, 6) skeleton(RegionClosing, Skeleton) dev_display(Image) dev_set_color('red') dev_display(Skeleton) stop()
gen_sin_bandpass( : ImageFilter : Frequency, Norm, Mode, Width, Height : )
产生一个正弦形状的带通滤波器
正弦的最大值由Frequency决定,Frequency的值介于0和1之间。
如果用fft_generic,参数Mode的dc_edge可以提升性能。
如果滤波用fft_image和fft_image_inv,Norm值必须设为none,Mode必须设为dc_center。
如果使用了rft_generic,Mode值必须设为rft。
参数列表:
第1个参数(out):以频域表示的带通滤波器
第2个参数(in):从DC面上,滤波器的最大距离,限制条件:frequency >= 0
第3个参数(in):滤波器的归一化因子
第4个参数(in):频域中DC的位置
第5个参数(in):图像(滤波器)的宽度
第6个参数(in):图像(滤波器)的高度
可替代项:
gen_std_bandpass
可能前置项:
fft_image, fft_generic, rft_generic
可能后置项:
convol_fft
dyn_threshold(OrigImage, ThresholdImage : RegionDynThresh : Offset, LightDark : )
当前背景之间差异明显时,可以设定全局阈值进行threshold,但很多情况下由于背景不均一,目标体经常表现为比背景局部亮一些或暗一些,无法确定全局阈值操作,需要通过其邻域找到一个合适的阈值进行分割。ThresholdImage是参考图像,通过与OrigImage对比找到领域确定阈值,一般采用平滑滤波算子(如mean_image)获取参考图像。offset设定邻域比较的区间范围,灰度值变化在offset范围内均是可以接受的。令 g_{o} = g_{OrigImage}, g_{t} = g_{ThresholdImage}分别代表原图和参考图中的像素点的灰度值.我们的做法是把参考图像的灰度值加上(减去)一个Offset,然后去和原图的像素点逐像素对应地进行比较。下面看Halcon中给出的这些公式:
The condition for LightDark = 'light' is:g_o>=g_t+offset ,light就提取相对参考图更亮的区域。
For LightDark='dark' ,the conditon is: g_o<=g_t-offset ,dark就提取相对参考图更暗的区域
For LightDark='equal',g_t-offset<=g_o<=g_t+offset,选取和参考图差不多的区域。
skeleton(Region : Skeleton : : )
拟合出该区域的骨架
效果如下:
---------------------
作者:hackpig
来源:www.skcircle.com
版权声明:本文为博主原创文章,转载请附上博文链接!

