halcon裂纹缺陷检测

article/2024/12/5 9:32:10

针对这一类表面的检测就不能单纯依靠帧差或者背景差来完成,因为背景的纹理不可能和当前图像的纹理完全相同。

方法一—局部阈值分割

一、局部阈值分割

1、gen_sin_bandpass–局部阈值分割

dyn_threshold(OrigImage, ThresholdImage : RegionDynThresh : Offset, LightDark : )

参数一:OrigImage (input_object)
需要进行阈值分割的原始图像

参数二:ThresholdImage (input_object)
通过一定图像预处理得到的阈值图像(这个预处理通常是对原图应用mean_image/gauss_image/binomial_filter 处理后的图像)

参数三:RegionDynThresh (output_object)
对原图进行阈值分割后输出图像

参数四:Offset (input_control) number
是一个阈值调节值,在做对比时,需要和ThresholdImage上某一点像素值同时作用
Default value: 5.0
Suggested values: 1.0, 3.0, 5.0, 7.0, 10.0, 20.0, 30.0
Typical range of values: -255.0 ≤ Offset ≤ 255.0 (lin)

Minimum increment: 0.01
Recommended increment: 5
Restriction: -255 < Offset && Offset < 255

参数五:LightDark (input_control)
是一个关键选择,’dark’, ‘light’, ‘equal’, ‘not_equal’一共有4种选择,明、暗、同、不同
Default value: ‘light’
List of values: ‘dark’, ‘equal’, ‘light’, ‘not_equal’

2、程序部分

* 关闭更新
dev_update_off ()
dev_close_window ()
* 读取图像
read_image (Image, 'D:/Halocn files/裂纹/surface_scratch')get_image_size (Image, Width, Height)
dev_open_window (0, 0, Width, Height, 'black', WindowHandle)
set_display_font (WindowHandle, 16, 'mono', 'true', 'false')
dev_display (Image)dev_set_draw ('margin')
dev_set_line_width (4)*平滑
mean_image (Image, ImageMean, 7, 7)
*使用局部阈值分割图像
dyn_threshold (Image, ImageMean, DarkPixels, 5, 'dark')connection (DarkPixels, ConnectedRegions)
select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 10, 1000)dev_display (Image)
dev_display (SelectedRegions)union1 (SelectedRegions, RegionUnion)
dilation_circle (RegionUnion, RegionDilation, 3.5)skeleton (RegionDilation, Skeleton)
connection (Skeleton, Errors)select_shape (Errors, Scratches, 'area', 'and', 50, 10000)
select_shape (Errors, Dots, 'area', 'and', 1, 50)
dev_display (Image)
dev_set_color ('red')
dev_display (Scratches)

----------------------原图-------------------------------------------------------平滑------------------------------------------局部阈值---------------------
在这里插入图片描述
结果
在这里插入图片描述

方法二—傅里叶变换+bool分析

一、滤波器

空间域和频域滤波器通常分为四种类型的滤波器——低通、高通、带阻和带通滤波器。
在这里插入图片描述
坐标越接近原点条纹越粗–低频
坐标轴靠右或下条纹越细—高频

在这里插入图片描述
低通–没有细节只有主体
高通–有细节没有主体

1、gen_sin_bandpass–正弦带通滤波器

gen_sin_bandpass( : ImageFilter : Frequency, Norm, Mode, Width, Height : )
该函数生成一个在频率域具有旋转不变性的正弦带通滤波器。
带通滤波器:主要可以使用在需要保留的波的频率在一定的范围内,用于去除周围的噪声,可以起到良好的效果
正弦带通滤波器
该函数生成一个在频率域具有旋转不变性的正弦带通滤波器。该sin函数的最大值由Frequency决定。Norm指定滤波归一化的参数,以实现滤波效率的最大化。fft_generic和Norm = ‘n’ 的应用,FFT将避免归一化。Mode用来确定滤波器中的DC项或者是否应该在实数值FFT中应用滤波。若应用 fft_generic ,‘dc_edge’ 将有更好的效率。若应用fft_image 和fft_image_inv进行滤波,则必须应用Norm = ‘none’ 和Mode =‘dc_center’ 。若应用rft_generic ,则Mode必须为Mode = ‘rft’。滤波值,对于DC项始终为0,在sin函数值达到Frequency前一直增加,当高于Frequency时下降。sin函数值范围为0到pi。其他点都设置为0.

参数一:ImageFilter (output_object)
带通滤波器作为图像的频域。
Default value: 0.1
Suggested values: 0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0
Restriction: Frequency >= 0

参数二:Frequency (input_control)
滤波器最大值到直流项的距离。
Default value: ‘none’
List of values: ‘n’, ‘none’

参数三:Norm (input_control)
滤波器的归一化因子。
Default value: ‘dc_center’
List of values: ‘dc_center’, ‘dc_edge’, ‘rft’
例如我要进行rft_generic的变换,那么我的高斯滤波器模式就要写为‘rft’。

参数四:Width (input_control)
图像(滤镜)的宽度。

参数四:Height (input_control)
图像(滤镜)的高度。

2、rft_generic—计算图像的实值快速傅里叶变换

一般需要使用两次,因为在频域处理完之后,还需要转换成空间域。

参数一:Image:输入图像
参数二:ImageFFT(out) :傅里叶变换输入图像
参数三:Direction:计算正向或反向变换。‘to_freq’是空间域—>频域的变换,ResultType一般选择’complex’;‘from_freq’是频域—>空间域的变换,ResultType一般选择’byte’(灰度图像)。
参数四:Norm:变换的归一化因子
参数五:ResultType:输出图像的图像类型,配合Direction参数设置
Width :输入图像的宽度

3、程序部分

* 关闭更新
dev_update_off ()
dev_close_window ()
* 读取图像
read_image (Image, 'D:/Halocn files/裂纹/surface_scratch')
* 图像反转
invert_image (Image, ImageInverted)
get_image_size (Image, Width, Height)
dev_open_window (0, 0, Width, Height, 'black', WindowHandle)
set_display_font (WindowHandle, 16, 'mono', 'true', 'false')
dev_display (Image)
* 
* 优化快速傅里叶变换的速度
* 首先,创建一个合适的带通滤波器。
*然后对输入图像进行傅里叶变换,在频域中进行滤波,增强高频信息。
*最后将其转化为空间域,对增强后的缺陷进行形态学后处理。
* 在频率域通过滤波实现图像划伤增强
* 生成正弦带通滤波器--可以去除图像中的噪声。然后傅里叶变换凸显出要检测的划痕。
gen_sin_bandpass (ImageBandpass, 0.4, 'none', 'rft', Width, Height)
* 快速傅里叶变换
rft_generic (ImageInverted, ImageFFT, 'to_freq', 'none', 'complex', Width)
* 图像卷积
convol_fft (ImageFFT, ImageBandpass, ImageConvol)
* 频域转换图像到空间域及byte类型
rft_generic (ImageConvol, Lines, 'from_freq', 'n', 'byte', Width)threshold (Lines, Region, 5, 255)
connection (Region, ConnectedRegions)
select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 5, 5000)
dilation_circle (SelectedRegions, RegionDilation, 5.5)
union1 (RegionDilation, RegionUnion)
reduce_domain (Image, RegionUnion, ImageReduced)
lines_gauss (ImageReduced, LinesXLD, 0.8, 3, 5, 'dark', 'false', 'bar-shaped', 'false')
union_collinear_contours_xld (LinesXLD, UnionContours, 40, 3, 3, 0.2, 'attr_keep')
select_shape_xld (UnionContours, SelectedXLD, 'contlength', 'and', 15, 1000)
gen_region_contour_xld (SelectedXLD, RegionXLD, 'filled')
union1 (RegionXLD, RegionUnion)
dilation_circle (RegionUnion, RegionScratches, 10.5)* 
* Display the results
dev_set_draw ('margin')
dev_set_line_width (3)
dev_set_colored (12)
dev_display (Image)
dev_display (RegionScratches)

---------------原图反转------------------------------------带通滤波-----------------------------快速傅里叶变换---------在这里插入图片描述------------------卷积----------------------------------频域转空间域-----------------------------------结果-----------------在这里插入图片描述
频域转空间域放大图
在这里插入图片描述

方法三—高斯滤波差分+bool分析

1、gen_gauss_filter–高斯滤波

gen_gauss_filter( : ImageGauss : Sigma1, Sigma2, Phi, Norm, Mode, Width, Height : )

参数一:ImageGauss(out) :生成的滤波器图像
参数二:Sigma1:空域(像素域)中,高斯分布在滤波器主方向的标准差
参数三:Sigma2:空域(像素域)中,高斯分布在垂直于滤波器主方向的标准差。注:Sigma1和Sigma2确定空间域内高斯函数的平滑量
参数四:Phi:滤波器在空间域的主要方向
参数五:Norm:滤波器的归一化因子。注:如果使用fft_image和fft_image_inv进行过滤,必须设置参数Norm = 'none’和Mode = ‘dc_center’(本文未使用)
参数六:Mode:频率图中心位置。注: 如果使用实值快速傅里叶变换算子rft_generic, 则Mode = ‘rft’ ;如果使用快速傅里叶变换算子fft_generic,则可以使用Mode = 'dc_edge’来提高效率
参数七:Width, Heigh:生成滤波图像的宽、高原理:首先产生一个高斯核,然后根据输入的参数对这个高斯核矩阵做傅里叶变换(实现从空域或时域到频域的转换工具),得到特定模式和特定分辨率的所谓频域的滤波器,例如我要进行rft_generic的变换,那么我的高斯滤波器模式就要写为‘rft’。并通过设置参数保持频域滤波器和原图像一致。

2、程序部分

dev_update_off ()
dev_set_draw ('margin')
dev_set_line_width (2)
read_image ( Image, 'D:/Halocn files/裂纹/surface_scratch')
get_image_size (Image, Width, Height)
* 提取背景fft_generic (Image, ImageFFT, 'to_freq', -1, 'sqrt', 'dc_center', 'complex')gen_gauss_filter (ImageGauss, 50, 50, 0, 'none', 'dc_center', Width, Height)convol_fft (ImageFFT, ImageGauss, ImageConvol)fft_generic (ImageConvol, ImageBackground, 'from_freq', 1, 'sqrt', 'dc_center', 'byte')* 图像减去背景,增加特征与背景对比度sub_image (Image, ImageBackground, ImageSub, 2, 100)* 中值滤波,为分水岭域做准备mean_image (ImageSub, ImageMedian, 7, 7)
*        median_image (ImageSub, ImageMedian, 'circle', 9, 'mirrored')dyn_threshold (ImageSub, ImageMedian, DarkPixels, 5, 'dark')connection (DarkPixels, ConnectedRegions)select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 200, 1000)dev_display (Image)
dev_display (SelectedRegions)union1 (SelectedRegions, RegionUnion)
dilation_circle (RegionUnion, RegionDilation, 6)skeleton (RegionDilation, Skeleton)
connection (Skeleton, Errors)select_shape (Errors, Scratches, 'area', 'and', 50, 10000)
select_shape (Errors, Dots, 'area', 'and', 1, 50)
dev_display (Image)
dev_set_color ('red')
dev_display (Scratches)

----------------------原图-----------------------------------快速傅里叶变换---------------------------高斯滤波-----------
在这里插入图片描述
----------------------背景图--------------------------------差分-----------------------------------------结果-----------------
在这里插入图片描述


http://chatgpt.dhexx.cn/article/SfPcZdOP.shtml

相关文章

使用 Python 进行深度学习以进行裂纹检测

使用 Python 进行深度学习以进行裂纹检测 问题陈述数据集准备训练模型结论参考 问题陈述 虽然新技术已经改变了我们生活的方方面面&#xff0c;在建筑领域似乎牛逼正在努力追赶。目前&#xff0c;建筑物的结构状况仍然主要是人工检查。简单来说&#xff0c;即使现在需要检查结…

Halcon-表面检测-----裂纹检测

对应示例程序&#xff1a; detect_mura_defects_blur.hdev 目标&#xff1a;实例实现LCD上有很多污点干扰下&#xff0c;检测LCD的印痕检测。 思路为&#xff1a;对LCD图像进行拆分&#xff0c;提取RGB三个分量。 对B分量进行处理&#xff0c;将其转换为频域内图像&#xff0…

图像中的裂纹检测

01. 数据集 我们首先需要从互联网上获取包含墙壁裂缝的图像(URL格式)数据。总共包含1428张图像:其中一半是新的且未损坏的墙壁;其余部分显示了各种尺寸和类型的裂缝。 第一步:读取图像,并调整大小。 images = []for url in tqdm.tqdm(df[content]): response = req…

html图片与文字轮播,我是这样写文字轮播的

原标题&#xff1a;我是这样写文字轮播的 作者&#xff1a;一半水一半冰 原文&#xff1a;http://www.cnblogs.com/jingh/p/6377736.html 1写在前面 最近总结下之前的工作&#xff0c;才恍然发现时间的流逝永远是悄无声息的&#xff0c;离开学校那座象牙塔已经也有大半年的时间…

IOS 文本文字下面添加下划线

2019独角兽企业重金招聘Python工程师标准>>> UILabel *infolabel [[UILabel alloc] initWithFrame:CGRectMake(30*RATIO,260*RATIO, self.view.bounds.size.width-60*RATIO, 20*RATIO)];infolabel.text "infoimcba.com";infolabel.textColor [UIColor …

html语言 特效字,用HTML和CSS实现酷炫的文字特效

前言 马上我们就要进入下一个阶段&#xff0c;也就是HTML和CSS实现前端界面的阶段了&#xff0c;想必很多小伙伴都想给自己的页面加点酷炫的特效&#xff0c;今天&#xff0c;我就给大家整理了一些非常酷炫的文字特效来装点你的页面&#xff01;有些是从网络上找的&#xff0c;…

python抓取图片数字_python 实现识别图片上的数字

Python 3.6 版本 Pytesseract 图像验证码识别 环境: (1) win7 64位 (2) Idea (3) python 3.6 (4) pip install pillow <&nbsp>pip install pytesseract (5) 识别引擎tesseract-ocr 安装 安装tesseract-ocr的识别引擎 第一步:下载安装包 我下载的是64位,根据自…

html改变字母间距,css怎么调整字体间距?

在前端开发的过程中&#xff0c;有时候可能会出现字与字之间比较紧凑&#xff0c;我们可以通过css设置文字间隔让字与字之间的距离大一点&#xff0c;下面我们来看一下如何使用css调整字体间距。 css中解决字与字间隔的方法是使用css样式属性letter-spacing&#xff0c;letter-…

html ul 加点,HTML ul compact 属性 | 菜鸟教程

HTML compact 属性 实例 在无序列表中使用compact属性&#xff1a; CoffeeTeaMilk 尝试一下 浏览器支持 所有主流浏览器都不支持 compact 属性。 定义和用法 HTML5 不支持 compact 属性。 请使用 CSS 替代。 的 compact 属性在 HTML 4.01 已废弃。 compact 属性是一个 boole…

css怎么将文字底下设置颜色,css如何设置文字颜色

css设置文字颜色的方法&#xff1a;1、在DIV标签内使用color颜色样式&#xff0c;代码为【 www.php.cn 】&#xff1b;2、在CSS选择器中使用color颜色样式CSS代码。 本教程操作环境&#xff1a;windows7系统、css3版&#xff0c;DELL G3电脑。 css设置文字颜色的方法&#xff1…

markdown/LaTeX中在字母下方输入圆点的方法

看下面的关联代数的乘法定义, 如果需要在 z z z下面加上一个点, 应该怎么做呢? 下面是一个采用\stackrel命令的方法 {\huge{}_{\stackrel{{}_{{}_{{}_{{}_z}}}}{{}^\cdot}}}\!\leq y⋅ z ⁣ ≤ y {\huge{}_{\stackrel{{}_{{}_{{}_{{}_z}}}}{{}^\cdot}}}\!\leq y ⋅z​​​​​…

html 字前边自动加点,css实现文字越界加点点点显示,并且后面紧跟一个图标

文字越界添加...显比抖朋要插支一圈不者地示 在HTML页面上&#xff0c;会遇到当文字长度超出一定长度的时候&#xff0c;将超出的部分显示为...的情况&#xff0c;这个功能很好实现&#xff0c;很多人都可以直接写出来。 示例代码&#xff1a; .demo { display: block; text-ov…

css文字下方加点

1、border-bottom: 1px dashed #333; 2、 text-emphasis: dot; text-emphasis-position: under; -webkit-text-emphasis: dot; -webkit-text-emphasis-position: under;

css+html 在文字下面加点。

效果 代码&#xff1a; 通过伪类的方式在content里面加点。然后定位在文字的下面。 <head> <style> .wavy { position: relative; } .wavy:before { content: "."; position: absolute; top: 10p…

linux 问题-——退出vi编辑器 wq失效

退出linux的vi编辑器时&#xff0c;先按左上角的esc按键&#xff0c;再输出输入命令 保存不退出w强制保存但不退出w!保存并退出wq强制保存并退出wq&#xff01;不保存退出q不保存并强制退出q! 出现以下问题&#xff1a; esc退出后&#xff0c;不能成功输出上述命令退出。 原因…

vi编辑器 末尾添加_vi编辑器操作指令分享

vi编辑器是所有Unix及Linux系统下标准的编辑器,它的强大不逊色于任何最新的文本编辑器,这里只是简单地介绍一下它的用法和一小部分指令。由于对Unix及Linux系统的任何版本,vi编辑器是完全相同的,因此您可以在其他任何介绍vi的地方进一步了解它。Vi也是Linux中最基本的文本编…

vi编辑器

目录 一、vim编辑器概念 1、为什么用vim编辑器&#xff1f; 2、vim的格式 二、vim的模式 1、命令模式 1.1退出vim快捷键 1.2光标跳转 1.3常用操作命令 2、输入模式 3、末行模式 一、vim编辑器概念 1、为什么用vim编辑器&#xff1f; Linux 系统中“一切皆文件”&…

VI编辑器小结

文章目录 一、vi编辑器的简要介绍二、vi编辑器的工作模式三、vi编辑器的使用方法 工作中发现vi编辑器用处很大&#xff0c;现总结一部分 一、vi编辑器的简要介绍 1、vi编辑器通常被简称为vi&#xff0c;它是Linux和Unix系统上最基本的文本编辑器&#xff0c;类似于Windows 系统…

linux学习之vi编辑器

一、vi编辑器功能 打开、新建、保存文件光标移动文本编辑&#xff08;多/单行/列&#xff09;复制、粘贴、删除查找、替换 二、配置vi编辑器 输入&#xff1b; cd /etc/vim cp vimrc ~/.vimrc cd ~ gedit .vimrc使用notepad打开本地文件 将内容复制到在虚拟机的.vimrc文…

vi编辑器的基本使用

目录 一、vi的基本概念 1.1 命令行模式&#xff08;command mode&#xff09; 1.2 插入模式&#xff08;Insert mode&#xff09; 1.3 底行模式&#xff08;last line mode&#xff09; 二、vi的基本操作 2.1 进入vi&#xff08;重要&#xff09; 2.2 切换至插入模式&am…