傅里叶变换进行缺陷检测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

处理结果预览

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

算法讲解

在实际的表面缺陷检测系统中,针对的检测表面很多是具有一定纹理的比如:布匹、皮革、塑料等,针对这一类表面的检测就不能单纯依靠帧差或者背景差来完成,因为背景的纹理不可能和当前图像的纹理完全相同。因此,本例程的算法通过将图像变换到频域进行处理,提取缺陷分量后反变换到时域,获得缺陷的具体位置。
在本算法中,在一开始就构造了两个高斯滤波器,高斯滤波器是一种线性平滑滤波器,适用于消除高斯噪声。滤波器的实质是对信号进行滤波,滤除不需要的部分,得到想要的部分。一个低通的滤波器可以滤除高频信号,对于图像来说,噪声和边缘往往集中在高频分量,因此低通能够降噪,但是也能造成图像的模糊。
关键就是使用两个低通滤波器,进行相减后构造了一个带阻滤波器来提取缺陷分量。这就需要保证在实际的待检测表面中缺陷所处的频率范围要和背景以及噪声有明显的差异,并且带阻的频率选择要合适。通过带阻滤波后获得的频率成分对背景中的纹理要有明显的抑制,并且突出缺陷成分,进行傅里叶反变换后重构的图像就是缺陷图像,经过简单的分割就能很容易得到缺陷了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/254422.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

lua环境搭建

前言 Linux & Mac上安装 Lua 安装非常简单&#xff0c;只需要下载源码包并在终端解压编译即可&#xff0c;本文介绍Linux 系统上&#xff0c;lua5.3.0版本安装步骤&#xff1a; Linux 系统上安装 [rootgitlab ~]# mkdir /app/tools/lua -p [rootgitlab ~]# cd /app/tools/l…

八、job管理

查看用法&#xff1a; [rootsuper65 ~]# salt-run -d|grep jobsjobs.active:                      #查看当前执行的job Return a report on all actively running jobs from a job id centric salt-run jobs.activejobs.list_job: salt-run jobs.list_j…

pthread_join/pthread_exit用法实例

函数pthread_join用来等待一个线程的结束。函数原型为&#xff1a;   extern int pthread_join __P ((pthread_t __th, void **__thread_return));   第一个参数为被等待的线程标识符&#xff0c;第二个参数为一个用户定义的指针&#xff0c;它可以用来存储被等待线程的返回…

thinkphp5 内置接口开发与使用

最近的一个项目在用tp5&#xff0c;对于tp3都几乎没用过的我来说~~~ tp5最好的一点就是对接口的单独封装&#xff0c;只要严格按照要求一步一步来就可以成功了 开启命令行&#xff1a;配置环境变量安装tp5项目cmd进入项目目录&#xff0c;运行php think&#xff0c;出现如下内容…

Halcon2019软件安装教程

文章目录1、halcon介绍2、安装halcon-19.11.0.0-windows.exe1、下载halcon-19.11.0.0-windows.exe安装包2、halcon-19.11.0.0-windows.exe软件安装3、验证Halcon安装1、halcon介绍 HALCON是德国MVtec公司开发的一套完善的标准的机器视觉算法包&#xff0c;拥有应用广泛的机器视…

爬虫常用库的安装

请求库(requests,selenium)、解析库(beautifulsop)、存储库、工具库等 urelib re 上面这两个是python自带的库 需要自己安装额库&#xff1a; (在windows下&#xff0c;使用pip install 命令) requests selenium用来驱动浏览器&#xff0c;做自动化测试&#xff0c;一些被js…

Python: 编程遇到的一些问题以及网上解决办法?

0.Python: TypeError: str does not support the buffer interface,(点我) fp.write(url.encode("utf-8")) 1.Python:object of type Response has no len()&#xff0c;如何解决&#xff1f;(点我) Traceback (most recent call last):File "F:/Python/TD.py&q…

快排简要介绍

<!DOCTYPE html><html lang"en"><head> <meta charset"UTF-8"> <title>Title</title></head> <body> <script> var arr [6,10,2,9,3,8,11,4,5]; function quickSort(data, start, end) { // 确定要…

在django中使用celery

前言: 针对高延时任务, 直接在一次网络请求中处理完毕会导致很不好的体验, celery则可以不阻塞请求后台处理这些任务, 并且可以使用django的models进行数据库操作.环境 python models: celery-4.1.1redis-2.10.6django-1.11.7其他: redis-3.2.9macospython3.6创建django工程 dj…

关于pragma pack的用法(一)

一个很重要的参数#pragma pack(n)数据边界对齐方式:以如下结构为例: struct {char a;WORD b;DWORD c;char d;}在Windows默认结构大小: sizeof(struct) 444416;与 #pragma pack(4)一样若设为 #pragma pack(1), 则结构大小: sizeof(struct) 12418;若设为 #pragma pack(2), 则…

TCL语言笔记:TCL中的String命令

一、介绍 字符串是 Tcl 中的基本数据类型&#xff0c;所以有大量的字符串操作命令。一个比较重要的问题就是模式匹配&#xff0c;通过模式匹配将字符串与指定的模式&#xff08;格式&#xff09;相匹配来进行字符串的比较、搜索等操作。 二、string命令列表 命 令 说 …

一文学会,胶位偏移、缺胶、断胶、溢胶检测

文章目录检测任务检测思路点胶质量检测代码及解析图示处理思路博主写作不容易&#xff0c;孩子需要您鼓励 万水千山总是情 , 先点个赞行不行 检测任务 点胶检查检测以下缺陷&#xff1a; 1.缺少粘合胶的部分&#xff08;断胶&#xff09; 2.粘合剂过多或过少的部分&#x…

『转载』hadoop2.x常用端口、定义方法及默认端口

『转载』hadoop2.x常用端口、定义方法及默认端口1.问题导读 DataNode的http服务的端口、ipc服务的端口分别是哪个&#xff1f;NameNode的http服务的端口、ipc服务的端口分别是哪个&#xff1f;journalnode的http服务的端口、ipc服务的端口分别是哪个&#xff1f;ResourceManage…

宏定义和内联函数的学习

宏定义可以提高效率&#xff0c;但是宏不是函数。 预编译通过代码复制的方式代替函数调用&#xff0c;省去了诸如函数压栈等系统过程&#xff0c;从而提高了效率。但是由于宏定义仅仅是代码替换&#xff0c;所以引起很多问题。#define MAX(a&#xff0c;b) (a) > (b) ? (…

HAProxy介绍及配置文件详解

一、HAProxy简介 HAProxy是一个开源的、高性能的、基于TCP和HTTP应用的负载均衡软件&#xff0c;借助HAProxy可快速、可靠地提供基于TCP和HTTP应用的负载均衡解决方案 二、HAProxy优点 1) 可靠性和稳定性非常好&#xff0c;可以与硬件的F5相媲美2) 最高可以同时维护40000--5000…

unbutu安装搜狗输入法【转载】

安装支持库 sudo apt-get install fcitx libssh2-1 如果安装过程中出现错误失败&#xff0c;运行apt-get -f install 查看支持库是否安装成功 dpkg -l | grep fcitx dpkg -l | grep libssh 下载搜狗输入法 wget "http://pinyin.sogou.com/linux/download.php?flinux&…

深入理解halcon相机标定

目录相机标定简介深度说明1、相机标定参数介绍2、标定板详细介绍问题1&#xff1a;halcon是否只能使用halcon专用的标定板&#xff1f;问题2&#xff1a;halcon标定板如何生成&#xff1f;问题3&#xff1a;halcon标定板如何摆放&#xff0c;拍照数量有无限制&#xff1f;标定步…

halcon模板匹配干扰边缘消除办法(最硬核方式)

目录halcon手绘形状匹配模板手绘形状匹配模板主要算子解析draw_nurbs 绘制平滑曲线参数解释create_shape_model_xld 使用XLD轮廓创建模板参数解释实例演示与解析实例代码展示与解析运行过程与处理展示读入图像绘制模板使用绘制的XLD创建模板查找模板博主写作不容易&#xff0c;…

往文件中写数据--增量

有的功能需要打印日志文件&#xff0c;但是日志文件太多不方便查看&#xff0c;我就把信息输出到一个TXT文件中了。 下面就是我将要说的&#xff0c;往文件中写数据&#xff08;增量&#xff09;&#xff0c;代码很简单&#xff0c;也可以放在你的代码中运行一下&#xff1a; /…

SQL Server 数据库查找重复记录的几种方法

http://www.hanyu123.cn/html/c61/6790.html 一、查某一列&#xff08;或多列&#xff09;的重复值。&#xff08;只可以查出重复记录的值&#xff0c;不能查出整个记录的信息&#xff09; 例如:查找stuid&#xff0c;stuname重复的记录&#xff1a; select stuid&#xff0c;s…