1.思路
FFT变换 -> 卷积滤波(得到图像的高频成分) -> FFT逆变换 -> 简单阈值分析选取即可
2.名词解释
图像的时域形式:我理解为是我们人眼所观察到的图像的一种能量的表现形式,感性的表现,定性;
图像的频域形式:频域就是图像的理性的表现,定量,图像的大部分能量集中在低,中频,高频部分的分量很弱;
FFT变换:快速傅立叶变换(fast Fourier transform),简单的理解就是将图像从时域变成频域;
图像的高频:亮度或灰度变化激烈的地方对应高频成分,如边缘,瑕疵点;
图像的低频:变化不大的地方对于低频成分,如大片色块区;
卷积滤波:空域的一个抽象运算转换成频域的一个简单数学乘法,这里我们将它理解为一种滤波,滤去低频得到高频(频率越高灰度值越高,图像越白);
FFT逆变换:将图像从频域变成时域,就是将滤波后的频域变换成时域,即将高频部分选取出来后的时域图像。
打广告时间:欢迎加入QQ群(Halcon交流+资料分享102389338(已满),2号Halcon交流+资料分享854753781)
[dengfenghai于2019-07-17 16:52编辑了帖子]
|
3.程序
* 窗口设置
dev_update_off ()
dev_close_window ()
read_image (Image, 'fft.jpg')
get_image_size (Image, Width, Height)
dev_open_window (0, 0, Width, Height, 'black', WindowHandle)
set_display_font (WindowHandle, 14, 'mono', 'true', 'false')
dev_set_draw ('margin')
dev_set_line_width (3)
dev_set_color ('red')
*
* 优化特定图像大小的FFT速度,实值FFT的运行时间优化。
optimize_rft_speed (Width, Height, 'standard')
*
* 结合两个高斯构造一个合适的滤波器
* 滤波器
Sigma1 := 12.0
Sigma2 := 3.0
* 在频域中生成高斯滤波器。
gen_gauss_filter (GaussFilter1, Sigma1, Sigma1, 0.0, 'none', 'rft', Width, Height)
gen_gauss_filter (GaussFilter2, Sigma2, Sigma2, 0.0, 'none', 'rft', Width, Height)
* 两个图像相减。
sub_image (GaussFilter1, GaussFilter2, Filter, 1, 0)
*
rgb1_to_gray (Image, Image)
* 在频域执行卷积
* 计算图像的实值快速傅立叶变换。 to_freq 傅里叶变换
rft_generic (Image, ImageFFT, 'to_freq', 'none', 'complex', Width)
*在频域中用滤波器卷积图像。
convol_fft (ImageFFT, Filter, ImageConvol)
* 计算图像的实值快速傅里叶变换。from_freq 傅里叶逆变换
rft_generic (ImageConvol, ImageFiltered, 'from_freq', 'n', 'real', Width)
* 确定矩形中的灰度值范围。
gray_range_rect (ImageFiltered, ImageResult, 10, 10)
* 确定区域内的最小和最大灰度值
min_max_gray (ImageResult, ImageResult, 0, Min, Max, Range)
* 使用全局阈值分割图像。
threshold (ImageResult, RegionDynThresh, max([2.55,Max * 0.25]), 255)
* 连通性分析
connection (RegionDynThresh, ConnectedRegions)
* 根据特性选取区域,这里根据area
select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 4, 99999)
* 区域并集
union1 (SelectedRegions, RegionUnion)
* 以圆形结构元素进行闭运算
closing_circle (RegionUnion, RegionClosing, 10)
connection (RegionClosing, ConnectedRegions1)
select_shape (ConnectedRegions1, SelectedRegions1, 'area', 'and', 10, 99999)
area_center (SelectedRegions1, Area, Row, Column)
*
* 显示设置
dev_display (Image)
Number := |Area|
if (Number)
gen_circle_contour_xld (ContCircle, Row, Column, gen_tuple_const(Number,30), gen_tuple_const(Number,0), gen_tuple_const(Number,rad(360)), 'positive', 1)
ResultMessage := ['Not OK',Number + ' defect(s) found']
Color := ['red','black']
dev_display (ContCircle)
else
ResultMessage := 'OK'
Color := 'forest green'
endif
disp_message (WindowHandle, ResultMessage, 'window', 12, 12, Color, 'true')