链接:https://pan.baidu.com/s/1PCam-4jnNOtBOixrK6Gdhw
提取码:bkqd
* 1.读取并显示图片 *************************************
dev_close_window ()
read_image (Image, './img.bmp')
get_image_size (Image, Width, Height)
dev_open_window_fit_size (0, 0, Width, Height, -1, -1, WindowHandle)
dev_display (Image)
set_display_font (WindowHandle, 16, 'mono', 'true', 'false')
dev_set_draw ('margin')
dev_set_line_width (3)
* 2.预处理图片 *****************************************
rgb1_to_gray (Image, GrayImage)
* 3.生成高斯滤波图 *************************************
sigma1 := 30.0
sigma2 := 5.0
gen_gauss_filter (ImageGauss1, sigma1, sigma1, 0, \
'none', 'rft', Width, Height)
gen_gauss_filter (ImageGauss2, sigma2, sigma2, 0, \
'none', 'rft', Width, Height)
* 高斯滤波图相减
sub_image (ImageGauss1, ImageGauss2, ImageFilter, 1, 0)
* 4.傅里叶变换 *************************************
* 图片转为频域图
rft_generic (GrayImage, ImageFFT, 'to_freq', 'none', 'complex', Width)
* 频域图做卷积处理(使用高斯滤波图)
convol_fft (ImageFFT, ImageFilter, ImageConvol)
* 频域图片转换为 领域图(实数)
rft_generic (ImageConvol, ImageFiltered, 'from_freq', 'n', 'real', Width)
* 5.提升对比度、连通域分析********************************
* 实数图片 ==> 0-255, 小于0赋值为0, 大于255赋值为 255
scale_image_range (ImageFiltered, ImageScaled, 0, 255)
threshold (ImageScaled, Region, 1, 255)
connection (Region, ConnectedRegions)
* 6.筛选 外框距离过滤********************************
* 获取外边框
get_domain (GrayImage, Domain)
boundary (Domain, RegionBorder, 'inner')
* 计算与外边框距离筛选区域(距离 > 1)
select_shape_proto (ConnectedRegions, RegionBorder, SelectedRegions, \
'distance_contour', 1, 9999)
* 7.筛选 内外灰度差过滤********************************
* 计算区域外部环状区域
dilation_circle (SelectedRegions, RegionDilation, 8.5)
difference (RegionDilation, SelectedRegions, RegionDifference)
* 计算区域外部 平均灰度值
gray_features (RegionDifference, GrayImage, 'mean', ValuesOut)
* 计算区域内部 平均灰度值
gray_features (RegionDilation, GrayImage, 'mean', ValuesInsider)
* 灰度差阈值
BackGrayValue := 0.8
* 灰度差
GrayDiff := (ValuesOut - ValuesInsider)
* 差值转换为 [-1,1....]的数组 大于0.8=1 小于0.8=-1
SgnFilter := sgn(GrayDiff - BackGrayValue)
* 元组筛选 获取SgnFilter元组中1 的索引列表
tuple_find (SgnFilter, 1, Indices)
* 使用索引列表 筛选出区域(均值小于 > 0.8的区域)
select_obj (SelectedRegions, ObjectSelected, Indices+1)
* 8.显示结果 *****************************************
dev_display (Image)
dev_display (ObjectSelected)