Halcon 傅里叶变换应用

傅里叶变换

  一个恰当的比喻是将傅里叶变换比作一个玻璃棱镜。棱镜是可以将光分解为不同颜色的物理仪器,每个成分的颜色由波长(或频率)来决定。

  傅里叶变换可以看做数学上的棱镜,将函数基于频率分解为不同的成分。当我们考虑关时,讨论它的光谱或频率谱。同样,傅里叶变换使我们能够通过频率成分来分析一个函数。

  图像的频率是表征图像中灰度变化剧烈程度的指标,是灰度在平面空间上的梯度。

  傅里叶变换在图像处理中可以做到图像增强与图像去噪、图像分割之边缘检测、图像特征提取、图像压缩等。

  如果对一幅精细的图像使用低通滤波器,那么滤波后的结果就只剩下轮廓了。

  高频成分:图像细节纹理属于高频分量,是图像灰度值变化剧烈的部分。

  低频成分:图像背景与轮廓属于低频分量,是图像灰度值变化缓慢的部分。

  低通滤波器:gen_lowpass 对空间域图像进行平滑处理,抑制高频分量。

  高通滤波器:gen_highpass 对空间域图像进行锐化处理,抑制低频分量。

  带通滤波器:gen_bandpass 使图像在某一部分的频率信息通过,其他过高或过低的频率信息抑制。

  带阻滤波器:使图像过低或过高的频率信息通过,某一部分频率信息抑制。

 

相关算子

gen_gauss_filter( : ImageGauss : Sigma1, Sigma2, Phi, Norm, Mode, Width, Height : )
* 在频域产生一个高斯滤波器
* 2.高斯分布在滤波器主方向上的空间域标准差,Sigma越大,高斯滤波器的频带就越宽,对图像平滑程度越高。
* 3.垂直于滤波器主方向的高斯分布在空间域的标准差。
* 4.滤波器在空间域的主要方向
* 5.滤波器的归一化因子。'n' 避免在FFT中归一化
* 6.直流项在频域的位置。
* 如果使用fft_generic,可以使用'dc_edge'来提高效率。
* 如果使用fft_image和fft_image_inv进行滤波,则必须使用Norm = 'none'和Mode = 'dc_center'* 如果使用rft_generic,则必须使用Mode = 'rft'
derivate_gauss (Image, ImageGauss, 3, 'none')
* 将一个图像与高斯函数的导数进行卷积。效果与FFT进行高斯滤波差不多。
主要的区别是边界处理:FFT的定义假设信号是周期性的,因此边界处理是循环的延续。与此相反,derivate_gauss在图像边界使用灰度值的镜像。
通过FFT进行过滤的速度已经快于在Sigma=3(排除创建过滤器的时间)中使用derivate_gauss。这种优势随着Simag的增大而变得更加明显。    
'none' 仅使用平滑
'x' 沿X的一阶导数    
gen_derivative_filter (DerivativeFilter, 'x', 1, 'n', 'rft', Width, Height)
* 在频域内产生一个导数滤波器,导数过滤器没有使用任何平滑
* 还要注意的是,不经过平滑处理的导数计算通常不会返回有用的结果,因为噪声会被显著放大。
gen_sin_bandpass (ImageBandpass, 0.4, 'none', 'rft', Width, Height)
* 生成一个正弦形状的带通滤波器
2.滤波器与直流项的最大距离
3.滤波器的归一化因子
4.直流项在频域的位置
5.图像宽度
6.图像高度
rft_generic (Image, ImageFFT, 'to_freq', 'none', 'complex', Width)
* 计算图像的实值快速傅里叶变换。在正向转换(Direction = 'to_freq')中,ResultType必须设置为'complex'* 3.'to_freq',输入图像必须具有实值类型,即,复杂图像不可用作输入。支持所有可以转换为real类型的图像的图像类型。在这种情况下,输出是一个维数(w/2+1)*h的复杂图像,其中w和h是输入图像的宽度和高度。指数-1* 'from_freq',输入图像必须是复杂的。在这种情况下,输入图像的大小不足以确定输出图像的大小。这必须通过将宽度设置为一个有效值来实现,必须为输入复像宽度的2*w-2或2*w-1。指数1。
* 4.变换的归一化因子。用户必须确保参数的一致使用。这意味着用于正向和反向转换的归一化因子相乘时必须产生w*h。
* 5.输出图像的图像类型。
fft_generic(Image : ImageFFT : Direction, Exponent, Norm, Mode, ResultType : )
* 计算输入图像的快速傅里叶变换图像。
1.输入图像
2.傅里叶转换图像
3.正向转换还是反向转换 'to_freq' 'from_freq'
4.指数的符号. 正向转换-1,反向转换1
5.转换归一化因子.    'n' 'none' 'sqrt'
6.直流项在频域的位置 'dc_center' 'dc_edge'
7.输出图像的类型 'complex' 'byte' 'real' ....
convol_fft (ImageFFT, ImageFilter, ImageConvol)
* 在频域内对图像与滤波器进行卷积,将复杂图像ImageFFT的像素乘以滤波器ImageFilter的相应像素。
首先将图像在水平(竖直)方向与滤波器进行卷积;然后将卷积后的结果在竖直(水平)方向使用相同的滤波器函数得到的模板进行卷积运算。
gray_range_rect (ImageFiltered, ImageResult, 10, 10)
* 确定矩形内的灰度值范围,每个图像点在掩膜矩形内的最大和最小灰度值的差值(max - min),掩膜为奇数(偶数-1)
correlation_fft (ImageFFT, ImageFFT, ImageCorrelation)
* 计算两个图像在频域的相关性
* 将ImageFFT1与ImageFFT2的共轭复数相乘,计算相关系数。
* 需要注意的是,为了在空间域实现相关性的正确缩放。
* 前向转换必须使用带Norm = 'none'的fft_generic或rft_generic操作符。
* 反向转换必须使用带Norm = 'n'的fft_generic或rft_generic操作符。
* 例程中使用local_max_sub_pix检测时前向和反向用的都是'n'
local_max_sub_pix (ImageFFTInv, 'gauss', 3, 0.0001, Row, Column)
* 图像局部极大值的亚像素精确检测。
1.输入亚像素图像
2.偏导数的计算方法 'facet','gauss'
3.'gauss'情况下Sigma确定高斯核的大小
4.海森矩阵特征值的最小绝对值。当海森矩阵的特征值都小于-阈值时,一个点被认为是局部最大值。
5.检测到的极大值的行坐标
6.检测到的极大值的列坐标
power_real (ImageFFT, PowerSpectrum)
* 计算complex图像的功率谱(频率的模),结果图像为real类型
binomial_filter (PowerSpectrum, ImageSmooth, 9, 9)
* 二项式滤波器是一个非常好的近似高斯滤波器,可以非常有效地实现只用整数操作。因此,binomial_filter非常快。

 

应用快速傅里叶变换处理图像

1.使用实值傅里叶变换图像与组合高斯滤波器卷积,计算滤波图像的灰度值范围gray_range_rect,通过灰度阈值检测塑料表面小凹点。

 

2.检测模糊图像中的不均衡缺陷,使用实值傅里叶变换图像与高斯滤波器进行卷积,转换成空间域后将原图像与滤波后图像进行sub_image求差值,得到清晰的缺陷图,应用lines_gauss提取线条。

 

 3.在高纹理图像中检测不均衡缺陷,从原始图像减去预估的背景光照,使得缺陷变得更明显(实值傅里叶变换+高斯滤波器卷积+图像相减)

接着使用中值滤波平滑纹理,通过阈值从图像中提取流域盆地,对盆地区域计算共现矩阵,得出其灰度值特征(灰度能量值),利用能量值筛选缺陷,缺陷对应的暗斑能量非常低。

 

 

 

 4.利用频域内的自相关(correlation_fft)技术,通过检测自相关图像中极大值(local_max_sub_pix)的子像素精确位置来确定单个模具的位置。

 

 

 5.实值傅里叶变换计算参考图像与检测图像的频域自相关,得到网格与参考图像相差的旋转角度。

* 首先,使用参考图像(旋转角度为0°)创建边缘方向的参考频谱。
* 通过将任意旋转网格边缘方向的频谱与参考频谱相关联,可以确定网格的旋转角度。
* 计算反向傅里叶变换后图像的灰度值get_grayval
* 根据灰度值创建函数create_funct_1d_array
* 计算函数的局部最大值和最小值local_min_max_funct_1d
* 返回函数在局部最大值位置的Y值get_y_value_funct_1d 
* 获取最大Y值对应的局部最大值,该值-1再乘以2即是角度。Angle := 2 * (InnerMaxPos[MaxPosAbs] - 1)

 

 6.快速傅里叶转换频域图,生成滤波器消除频域图垂直方向的干扰,反向傅里叶变换得到消除干扰后的图像。

fft_generic(Image,ImageFFT,'to_freq',-1,'sqrt','dc_center','complex')

gen_rectangle1 (Rectangle1, 0, Width/2-2, Height/2-10, Width/2+2)
gen_rectangle1 (Rectangle2, Height/2+10, Width/2-2, Height, Width/2+2)
union2 (Rectangle1, Rectangle2, RegionUnion)

paint_region (RegionUnion, ImageFFT, ImageResult, 0, 'fill')
fft_generic(ImageResult,ImageFFT,'from_freq',1,'sqrt','dc_center','byte')

 

 6.在不均匀照明的表面检测缺陷(划痕),创建一个合适的正弦带通滤波器。然后通过在频域进行滤波来增强划痕。最后,对增强缺陷进行形态学后处理。

 7.在频域滤波下从干扰背景纹理中分离前景信息。

* 首先,对图像进行快速傅里叶变换fft_generic以获得其频谱power_real。
* 然后,我们在频谱中检测干扰背景纹理对应的频率峰值。
* 然后,建立一个滤除这些频率的滤波器,并应用于频谱。
* 通过对滤波后的频谱进行反向傅里叶变换,得到去除背景纹理的滤波图像。

8.消除周期性噪声

包含周期性噪声的图像在傅里叶变换后的频域图像有多个中心(亮点),表现为高能量点。

消除这些不在频域图像中心的其他小亮点,就是在空间域中消除周期性噪声。

 

read_image (zouqi,'zouqi.jpg')
dev_open_window (0, 520, Width, Height, 'black', WindowHandle1)
rgb1_to_gray (zouqi, zouqi)
fft_image (zouqi, ImageFFT4)
power_real (ImageFFT4, PowerSpectrum)
*二项式滤波(配合功率谱算子)
binomial_filter (PowerSpectrum, ImageSmooth, 9, 9)
*阈值化获得高能量点
threshold (ImageSmooth, Region, 100, 1800)
connection (Region, ConnectedRegions)
select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 5, 100)
union1 (SelectedRegions, RegionUnion)
*获得区域内图像域
reduce_domain (ImageSmooth, RegionUnion, ImageReduced)
*获得局部极大值
local_max (ImageReduced, LocalMaxima1)
*膨胀处理区域
dilation_circle (LocalMaxima1, RegionDilation, 9)
*在傅里叶变换中绘制对应区域的灰度值为0
paint_region (RegionDilation, ImageFFT4, ImageFFTFiltered, 0, 'fill')
*傅里叶逆转换,获得去除周期噪声所在区域的频率后的图像
fft_generic (ImageFFTFiltered, ImageFiltered, 'from_freq', 1, 'sqrt', 'dc_center', 'byte')

 

posted @ 2020-05-20 23:34  Z大山  阅读(8761)  评论(0编辑  收藏  举报