参考文章
图像傅里叶变换的 图像处理(5)--图像的傅里叶变换_ShaneHolmes的博客-CSDN博客_图像傅里叶变换
高斯核函数的
https://www.cnblogs.com/shine-lee/p/9671253.html
首先,我们要知道滤波用的高斯核函数的标准差与他的频谱图之间的关系
图像高斯滤波使用的二维高斯核为x和y两个一维高斯的乘积,也就是说二维高斯核有2个标准差参数,分别是水平及竖直
halcon中 算子 gen_gauss_filter( : ImageGauss : Sigma1, Sigma2, Phi, Norm, Mode, Width, Height : )即为用来产生高斯滤波器;
其中Sigma1, Sigma2分别为水平及垂直于水平方向的标准差
高斯核可以看成是与中心距离负相关的权重。平滑时,调整标准差实际是在调整周围像素对当前像素的影响程度,调大标准差即提高了远处像素对中心像素的影响程度,滤波结果也就越平滑。高斯曲线随𝜎σ变化的曲线如下:
可见标准差越小图像越靠近x=0这条线 反映在频谱图上则是图像越靠近中心点,这幅图像的频谱图是经过居中处理的,对应于算子 gen_gauss_filter中Norm参数的‘dc_center’,未经居中处理的对应于'dc_edge',若使用实数傅里叶变换rft_generic的话,对应'rft',他的频谱图是未经居中处理的频谱图的左侧
而图像频谱图与其频率特性又对应如下,分为经过频谱居中处理及未经频谱居中处理两种
图像的'尖锐',‘棱角分明’的部分对应于高频,过渡平缓的部分对应于低频
了解了以上内容,我们就可以利用频域来对图像进行滤波处理
先来看一个利用高斯滤波器生成低通滤波器(保留低频,去掉高频,作用是平滑图像)进行缺陷检测的例子
下面是待检测划痕的原图
运行如下程序
*设置区域的填充方式
dev_set_draw ('margin')
*利用频域对缺陷图像进行检测
read_image (Image, '//Mac/Home/Downloads/7.Halcon缺陷检测视频教程/Halcon缺陷检测视频教程配套资料/背景网格产品刮伤缺陷检测@/lcd/mura_defects_blur_01.png')
get_image_size (Image, Width, Height)
*将图像抓换为灰度
rgb1_to_gray (Image, GrayImage)
*拆分图片 将图片拆分为3通道
decompose3 (Image, R, G, B)
*对灰度图像进行颜色反转
invert_image (GrayImage, ImageInvert)
*进行实数傅里叶变换 变换后图像的大小改变
rft_generic (B, ImageFFT, 'to_freq', 'none', 'complex', Width)
get_image_size (ImageFFT, Width1, Height1)
*创建一个高斯滤波核,用以与进行傅里叶变换后的图像进行卷积
*这里的高斯核为低通,用以平滑图像,后面与原图做差值
gen_gauss_filter(ImageGauss, 100, 100, 0, 'n', 'rft', Width, Height)
*进行频域卷积处理 卷积操作不会改变图像大小
convol_fft (ImageFFT, ImageGauss, ImageConvol)
*将频域图像转换为空间域
rft_generic (ImageConvol, ImageFFT1, 'from_freq', 'none', 'byte', Width)
*将原图像与经过滤波的图像相减
sub_image (B, ImageFFT1, ImageSub,2,100)
*ImageSub =( ImageMinuend - ImageSubtrahend ) *Mult + Add
*之所以乘以Mult是要拉大两幅图像相减后的对比度,加上一个Add是为了增加相减后的图像的整体亮度。
*设置提取线条的阈值
calculate_lines_gauss_parameters (40, [25,3], Sigma, Low, High)
*根据高斯核选出线
lines_gauss (ImageSub, Lines, Sigma, Low, High, 'dark', 'true', 'gaussian', 'true')
这是经过滤波的图像 可以看到确实非常平滑
这是最终的结果
利用高斯核函数制作高通滤波器来“锐化”图像已达到缺陷检测的例子稍后再更