傅里叶变换进行缺陷检测detect_indent_fft.hdev(源代码与详细解析)
文章目录
- 简介
- 程序解析
- 处理结果预览
- 算法讲解
简介
detect_indent_fft.hdev是halcon的示例程序,是傅里叶变换进行缺陷检测的一个例子,主要是傅里叶变换在复杂背景下的缺陷检测。
这个程序展示了如何利用快速傅里叶变换(FFT)对塑料制品的表面进行缺陷检测,大致分为三步:
1、用高斯滤波器构造一个合适的滤波器(将原图通过高斯滤波器滤波);
2、将原图和构造的滤波器进行快速傅里叶变换;
3、利用形态学进行缺陷检测。
程序解析
关于显示类函数解释https://blog.csdn.net/cashmood/article/details/93999690
dev_updata_off()
dev_close_window() //关闭活动的图像窗口
读入图片
read_image(Image,’plastics/plastics_01’)
获取图片的长宽
//参数说明:读入的图片(Image); 图片的宽(Width);图片的高(Height)
get_image_size(Image,Width,height)
dev_open_window(0,0,Width,Height,’Black’,WindowHandle)
设置显示字体
set_display_font (WindowHandle,14,’mono’,’ture’,’false’)
dev_set_draw(‘Margin’)
dev_set_line_width(3)
dev_set_color(’red’)
(根据图像大小进行fft速度最优化)
对指定大小的图片的fft速度进行优化
//参数说明:图片大小(Width,Height);优化模式(’standard’);
optimize_rft_speed(Width,Height,’standard’)
(结合两个高斯滤波器构造一个合适的滤波器)
定义两个常量
Sigma1 := 10.0 Sigma2 := 3.0
在频域生成两个高斯滤波器
//参数说明:生成的高斯滤波器(GaussFilter); 空域中高斯在主方向上的标准差(Sigma); 空域中高斯在正交于主方向的方向上的标准差(Sigma);滤波器主方向的角度(0.0); 滤波器的规范(’none’);直流项在频域的位置(’rft’);图片的大小(Width,Height)
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(ImageMinuend, ImageSubtrahend : ImageSub : Mult, Add : )
//g’ := (g1 - g2) * Mult + Add
sub_image(GaussFilter1,GaussFilter2,Filter,1,0) //两图片相减(灰度)
(开始进行图像检测)
NumImages := 11
for循环从1到NumImages,步长为1
for Index := 1 to NumImages by 1
read_image(Image,’plastics/plastics_’+Index$’02’)
将图片转化为灰度图,第一个参数为原图
rgb1_to_gray(Image,Image)
*Perform the convolution in the frequency domain
对一幅图片进行快速傅里叶变换
//参数说明:输入的图片(Image);傅里叶变换后输出的图片(ImageFFT);变换方向(’to_freq’或’from_freq’);变换因子的规范(’none’);输出图片的数据类型(’complex’);图片的宽(Width)
rft_generic(Image,ImageFFT,’to_freq’,’none’,’complex’,Width)
图片用一个滤波器在频域进行卷积运算
//参数说明:输入的图片(ImageFFT);频域滤波器(Filter);运算后输出的结果
convol_fft(ImageFFT,Filter,ImageConvol) //对图片用一个滤波器在频域进行卷积运算
对滤波后的图片进行快速傅里叶反变换
rft_generic(ImageConcol,ImageFiltered,’from_freq’,’n’,’real’,Width)
用一个矩形掩膜计算像素点的灰度范围
//参数说明:输入的图片(ImageFiltered); 输出的灰度范围图(ImageResult);矩形掩膜大小(10,10)
灰度范围计算方法:矩形掩膜内的最大灰度值-最小灰度值
gray_range_rect(ImageFiltered,ImageResult,10,10)
求图片灰度值的最大和最小值和变换范围
//参数说明:待分析图片区域(ImageResult); 图片(ImageResult);被去除的直方图两边像素点所;占总像素数的百分比(0);得到的最小值最大值及灰度值范围(Min,Max,Range)
min_max_rect(ImageResult,ImageResult,0,Min,Max,Range)//判断区域内灰度值的最大和最小值
利用全局阈值对图像进行分割
//参数说明:输入的图片(ImageResult);分割后得到的区域(RegionDynThresh);阈值(max([5.55,Max0.8]),255);公式:MinGray <= g <= MaxGray
threshold(ImageResult,RegionDynThresh,max([5.55,Max0.8]),255)//
分割连通域
//参数说明:输入的区域(RegionDynThresh);分割连通域后的区域(ConnectedRegions)
connection(RegionDynThresh,ConnectedRegions)
根据面积筛选区域
select_shape (ConnectedRegions,SelectedRegions,’area’,’and’,4,99999)
合并区域
union1(SelectedRegions,RegionUnion)
使用圆形元素对区域进行闭运算
closeing_circle(RegionUnion,RegionClosing,10)
分割连通域
connection(RegionClosing,ConnectedRegions1)
根据面积筛选区域
select_shape(ConnectedRegions1,SelectedRegions1,’area’,’and’,10,99999)
计算区域的面积以及中心位置
area_center(SelectedRegions1,Area,Row,Column)
显示结果
dev_display(Image)
定义一个变量统计区域的个数
//参数说明:在halcon中“||”代表求数组内元素的个数
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’
如果不存在缺陷区域,显示OK
endif
disp_message(WindowHandle,ResultMessage,’window’,12,12,Color,’ture’) if(Index#NumImages)disp_continue_message(WindowHandle,’black’,’ture’)stop()endif
endfor
处理结果预览
算法讲解
在实际的表面缺陷检测系统中,针对的检测表面很多是具有一定纹理的比如:布匹、皮革、塑料等,针对这一类表面的检测就不能单纯依靠帧差或者背景差来完成,因为背景的纹理不可能和当前图像的纹理完全相同。因此,本例程的算法通过将图像变换到频域进行处理,提取缺陷分量后反变换到时域,获得缺陷的具体位置。
在本算法中,在一开始就构造了两个高斯滤波器,高斯滤波器是一种线性平滑滤波器,适用于消除高斯噪声。滤波器的实质是对信号进行滤波,滤除不需要的部分,得到想要的部分。一个低通的滤波器可以滤除高频信号,对于图像来说,噪声和边缘往往集中在高频分量,因此低通能够降噪,但是也能造成图像的模糊。
关键就是使用两个低通滤波器,进行相减后构造了一个带阻滤波器来提取缺陷分量。这就需要保证在实际的待检测表面中缺陷所处的频率范围要和背景以及噪声有明显的差异,并且带阻的频率选择要合适。通过带阻滤波后获得的频率成分对背景中的纹理要有明显的抑制,并且突出缺陷成分,进行傅里叶反变换后重构的图像就是缺陷图像,经过简单的分割就能很容易得到缺陷了。
傅里叶变换进行缺陷检测detect_indent_fft.hdev(源代码与详细解析)相关推荐
- 设计学生证信息管理系统(C++实现,附源代码,详细解析)
学生证信息管理系统 C++实现 录入学生的学生信息 给定学号显示学生的信息和给定班级显示全班 给定某位学生的学号,修改该学生的学生证信息 给定某位学生的学号,删除该学生的学生证信息 统计每班的某个号次 ...
- kaggle猫狗分类的总结(AlexNet模型, keras框架),完整实验流程,源代码和详细解析
现在将已掌握的知识进行总结,方便以后自己写网络增加思路. 首先数据集下载:链接:https://pan.baidu.com/s/1U4N0PCNfyIP9iHLidVb9xA 提取码:vcvl ker ...
- Halcon缺陷检测——差分
缺陷检测--差分+定位 1. 简单的差分 案例1:检测毛刺 案例2:电路板线路缺陷检测 案例3:瓶口破损缺陷检测 2. 模板匹配定位+差分 案例1:印刷质量缺陷检测(standard) 案例2:检测工 ...
- HALCON示例程序novelty_detection_dyn_threshold.hdev纱网缺陷检测
HALCON示例程序novelty_detection_dyn_threshold.hdev纱网缺陷检测 示例程序源码(加注释) 关于显示类函数解释 dev_update_window ('off') ...
- HALCON示例程序inspect_solar_fingers.hdev太阳能电池板电路缺陷检测
HALCON示例程序inspect_solar_fingers.hdev太阳能电池板电路缺陷检测 示例程序源码(加注释) 关于显示类函数解释 dev_update_off () dev_close_w ...
- HALCON示例程序inspect_bottle_mouth.hdev玻璃瓶口缺陷检测
HALCON示例程序inspect_bottle_mouth.hdev玻璃瓶口缺陷检测 示例程序源码(加注释) 定义变量并初始化 SmoothX := 501 ThresholdOffset := 2 ...
- CoBot 库博源代码缺陷检测工具
CoBot 库博源代码缺陷检测工具 支持10种语言(java暂时不支持) 支持压缩包.本人现场观测厂家演示GIT\SVN导入 29000行代码检测大概1分钟完成 可以自定义 缺陷检测项 其它同类开源: ...
- Halcon 缺陷检测 金属拉丝表面缺陷检测(乘法增强、傅里叶变换与卷积、纹理过滤、动态阈值)
Halcon 缺陷检测 拉丝表面缺陷检测(乘法增强.傅里叶变换与卷积.纹理过滤.动态阈值) 文件下载 链接:https://pan.baidu.com/s/1HNl4vy0jEaFx5OUuBDAMX ...
- halcon缺陷检测——频域
缺陷检测--频域和空间域 1. 理解傅里叶变换 2. 读懂频谱图 3. 使用频域处理图像的案例 3.1 脏污检测 3.2 检测表面微小凸起 3.3 检测磨砂表面的缺陷 4. 资源下载 1. 理解傅里叶 ...
最新文章
- 可用于nodejs的SuperAgent(ajax API)
- 第130天:移动端-rem布局
- trace分析优化器执行计划 || optimizer
- google 用新的tab打开网页
- CANOpen网络管理报文
- 关于一个跨域的小问题
- HDU-1176-免费馅饼(dp)
- 基于visual Studio2013解决C语言竞赛题之0608水仙花函数
- SQL PASS西雅图之行——University of Washington篇
- linux malloc和free解析
- 网络信息安全攻防实验室 脚本关第二关
- 编写树莓派引脚驱动代码
- SPI通信协议学习笔记
- java 权限访问共享文件夹_在Java程序中读写windows共享文件夹
- 基于机智云的智能花盆1.0
- 现代电子计算机音乐制作,现代电子音乐制作利器——Alesis VI61 MIDI键盘
- 心理专家浅谈舍弃不必要的虚荣!
- 一日2篇Nature!中科大校友段镶锋团队纳米材料新成果,曾是贝尔比奖章第三位华人得主...
- IQueryable VS IEnumerable
- RegCloseKey