基于FFT的瑕疵检测

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')

原文地址:https://www.cnblogs.com/wwwbdabc/p/11678136.html