草庐IT

缺陷检测(图像处理部分)

视觉菜鸟Leonardo 2023-07-17 原文

论文一:工件表面微小缺陷的检测与识别方法

 提出“基于像元搜索算法的微小缺陷检测方法”。

首先采用直方图均衡化提升背景与缺陷目标的对比度,利用中值和均值滤波对图像进行去噪,根据背景灰度分布,在目标分割过程中采用分块、按方差大小排除背景图像块、初定目标和剔除伪目标的缺陷像元搜索算法,最后采用矩形度和区域占空比进行缺陷特征提取。

重点:基于缺陷像元搜索的目标分割算法

适用场景:

(1)图像的背景区和目标区在整体上灰度对比不明显,但在小范围内背景和目标是可分的。

(2)图像的方差能够反映图像灰度值的变化幅度

(3)相邻像元灰度差值的大小能反映它们的归属区域

(4)目标区域不会孤立存在,同时满足均匀性和连通性的原则

步骤:(1)首先把经预处理后图像 X 分割成均匀的若 干小块 X = { X1,X2,…,Xn } . 在分割时,每个小块可 以全部为背景,也可以是背景和缺陷的组合,但不 能全部为缺陷. 接着计算每小块图像的方差,并按 方差由小到大的顺序排列成有序序列{ σ2 1 ( j) } ; 然 后从{ σ2 1 ( j) } 中去掉由小到大 60% ( 微小缺陷的区 域面积与整幅图像的面积比值小于 0. 5) 的方差值 对应的图像块,再将{ σ2 1 ( j) } 中剩余的 40% 的方差组成新的方差序列,此时{ σ2 1c ( j) } 所对应的图像 块中,一部分是包含缺陷的图像块,同时还有一部 分是背景区域图像块。

(2) 对{ σ2 1c ( j) } 对应的每一个图像块进行如下 操作. 首先初步确定缺陷目标点,计算每个图像块 的均值,记为 fmean . 从左到右、从上到下遍历每个图 像块的像元,若像元 fi,j满足下面条件,则标记为背 景点: fi,j > fmean

遍历 fi,j后的像元若满足下面条件: fi,j + 1 - fi,j < αfmean则认为像元 fi,j + 1同前一个像元 fi,j 性质相同,同标 记为背景点或缺陷目标点,否则当前像元与前一个 像元性质相反.

(3) 在初次遍历结束后,每一小块图像中的像 元被分割为背景和缺陷目标 2 部分,在这个过程 中,有少部分背景被错分为缺陷目标,所以需要剔 除初次遍历后的伪目标点. 缺陷目标以一定大小的 连通域存在,为了判断初次遍历中所标记的缺陷像 元是否为真正的缺陷,以当前像元为核心,在形成 3 × 3 窗口中,若至少包含有一半以上的缺陷像元, 则认为该像元为缺陷点,并利用式( 5) 重新判断其 后的像元性质

论文二:基于机器视觉的金属表面缺陷检测方法研究与系统实现

传统的去噪方法:图像去噪方法可以分为基于滤波器去噪、基于模型去噪、基于学习去噪等。其中,基于滤波器的去噪方法是图像去噪领域最先研究与发展的一类方法。滤波器去噪方法又可以分为基于空间域去噪和基于变换域去噪。

        基于空间域的滤波去噪方法一般是通过分析在一定大小的窗口内,中心像素与其他相邻像素中间在灰度空间的直接联系,来获取新的中心像素,形成去噪后的图像。基于空间域的去噪方法有均值滤波、中值滤波、双边滤波、高斯滤波、维纳滤波、非局部均值滤波等。而基于变换域的去噪方法是通过将图像由空间域转换到变换域中,根据噪声特点改变变换系数,将图像再转换回空间域中得到新的图像,从而到达去噪的目的。常见的基于变换域的去噪方法有傅里叶变换、离散余弦变换、小波变换等。

分割方法:基于阈值的分割方法的主要特点是实现简单、计算量小、易于实现,使用于目标与背景区别较大的情况。基于边缘的分割方法主要是通过微分算子来检测根据图像中灰度值不连续,突变的边缘,进而区分目标与背景。一阶微分算子有 Sobel 算子、Robert 算子等,其计算简单、速度快,但是定位不准确。二阶微分算子有 Canny 算子、Log 算子和 Laplacian 算子等。该类算子边缘定位准确,但是对于噪声敏感。因此,在采用二阶微分算子时需要进行必要的图像去噪处理。

Canny边缘检测流程:

a) 图像平滑滤波; 
b) 计算图像梯度与方向; 
c) 通过非极大值抑制保留局部梯度最大的点,得到细化的边缘; 
d) 通过双阈值检测真实和潜在的边缘,形成边缘图像。 

ROI轮廓筛除:

此类处于 ROI 外部的边缘信息是需要进行单独剔除的。 由前面提到的此类边缘信息的出现原因与表现形式可知,其形成轮廓的长度、面积等几何特征是远远小于 ROI 轮廓的。因此,可以根据边缘图像中边界轮廓的几何特征的差异简单区分出 ROI 外部的干扰点。具体实施步骤如下:提取图像的边缘信息,整理为边界轮廓列表;计算每个轮廓几何特征大小,并选取特定的判断阈值;将低于阈值的轮廓所对应的边缘信息剔除。 首先,在筛选 ROI 外部的边缘信息之前,需要对边缘图像进行形态学的闭运算操作,如图 2-6(a)所示。闭运算操作是先做形态学膨胀操作,再进行腐蚀操作。其在膨胀阶段能够将非闭合的边缘像素线段转换为成片的连接区域,而在腐蚀阶段能够保证较大 ROI 区域轮廓不变。其好处是:第一,在计算轮廓特征时能够减少计算轮廓的数量;第二,方便后续处理中填充轮廓的内部区域。 然后,在图 2-6(a)的基础上提取图像边缘轮廓信息,根据轮廓序列计算图像轮廓几何特征时仅考虑轮廓的面积大小。在本小节中,采用所有轮廓面积总和的均值作为阈值T ,筛查面积小于阈值T 的轮廓,如图 2-6(b)所示。其中,与直接提取图2-5 中轮廓序列(共 374 个轮廓)相比,经过闭运算处理后的图像轮廓数量为 120个,减少 254 个,这样大大减少了后续轮廓筛选的的计算量。 

 缺陷分类方法研究:

图像分割、形态学处理、连通域分析

连通域分析,将图像连通域轮廓的几何特征值直接与设定的判断阈值对比,识别缺陷情况。 首先,判断图像中独立的连通域是否属于缺陷。在几何特征中,选择每个独立的连通域轮廓的面积和周长,其简单直观地反映缺陷的尺寸大小。图像轮廓面积Area 定义为轮廓内部(不含内轮廓)包含的图像像素数目的总和,计算公式如(3-1)所示;图像轮廓长度 Length 定义为包围轮廓边界的像素个数总和,计算公式如(3-2)所示。  R 表示轮廓区域的像素范围。 

 分类识别数据集:

 论文三:基于机器视觉的产品表面缺陷在线检测系统的设计

 

 系统设计的原理主要是采用滚筒运动时带动编码器旋转,旋转的编码器会输出外触发信号到线阵相机上,从而控制线阵相机采用行扫描的方式进行图像采集,当相机将采集到的多帧图像数据通过千兆网传送给工控机时,图像处理软件会将这多帧图像数据组帧成一幅图像并生成为 BMP 格式,随后做图像处理,并检测目标产品表面有无瑕疵,当检测到有瑕疵时,工控机输出控制信号控制执行机构进行后续处理。

检测算法的设计:图像增强

图像分割:拍摄的图像为灰度图,所以需要进行灰度阈值分割,文章根据图像的灰度直方图信息对图像分割的阈值进行选取,采取的是全局阈值(极其不建议)

进行形态学处理:膨胀->骨架提取->特征提取

 

 

 论文四:基于机器视觉的电池表面缺陷检测技术研究

 光源选取:

大部分零件缺陷检测的光源选择都围绕着环形光、球积分和同轴光进行,文章对比了环形光源和同轴光源。

 

 最终确定在暗箱中使用同轴光照明

图像处理与分析模块是本系统软件的重点,当图像通过机器视觉硬件系统完成采集,接着需要计算机软件对其进行处理与分析,包括以下步骤: 
1、当机器视觉硬件装置采集完图像,程序通过调用相机提供的驱动 API 函数,可从相机底层读取图像至内存。 
2、图像处理代码可完成图像前期处理,获得便于后续分析的图像;处理算法将包括预处理、目标定位、字符校正等,从而将原始电池图像中的各目标准确
定位,完成前期处理。 
3、特征分析代码对图像整体或局部区域进行特征值计算,返回能够度量图像某些特征的向量;模式识别代码将对特征向量进行计算,得出判别结果。 

 图像处理算法:

 采用中值滤波效果最好

 图像增强:

(1)直方图均衡化

(2)限制对比度自适应直方图均衡化

(3)小波增强

图像二值化:

采用OTSU算法计算出最佳阈值T

形态学处理 :

膨胀、腐蚀

 图像处理完后,需要进行图像定位和校正:

(1)多目标定位检测

(2)字符倾斜角度计算

(3)图像旋转 

区域定位:ROI(Region Of Interest)为图像感兴趣区域,如图 4.2 所示,各个电池目标所在正方形区域即为 ROI。原始并行检测的图像中若含有 4 个电池目标,即该图像具有 4 个 ROI 区域,每个 ROI 区域边长为 d。设电池轮廓半径为 r,则 d 值应略大于 2r。 如果能从图 4.2 所示的电池目标区域中,快速计算出各目标中心点 Oi(i=1,2,3,4)坐标值,再分别以 Oi为中心,通过设置合适边长的外接正方形,因电池轮廓曲线为圆形,因此外接正方形可恰好包含各电池目标。实际上在采集图像过程中,不同次所采集图像的各目标中心点 Oi的坐标值并非固定,受各种误差以及控制精度的影响,原始图像边界到 ROI 区域的距离 x、y 值为变量。因此准确定位各电池目标,必须得准确计算出目标中心各坐标 Oi(i=1,2,3,4)。 

 算法设计:曲线拟合算法,对每个电池目标轮廓像素点进行拟合计算,从而获得曲线相关参数,进而可求出曲线中心坐标值。 

使用基于最小二乘法的椭圆拟合计算方法。

1、对原始灰度图像采用较低的分割阈值进行二值化处理;阈值要低于表面字符灰度值,从而二值化后,字符区域与圆内背景区域像素值均被置 1,最大程度减少二值化后所的无关轮廓数; 
2、获得二值图像后,通过轮廓跟踪计算获得二值图像各个连通区域的轮廓像素点集,即多组二维点集;非电池目标所形成的二值轮廓较小,轮廓像素点少,在算法中设置阈值将其舍去,即能排除无关目标干扰,又能提高后续拟合效率; 
3、对余下的各组二维点集使用最小二乘法进行椭圆拟合,求出中心坐标和轴半径; 
4、根据中心坐标和长轴半径、短轴半径,对检测目标的有效性进行判别; 
5、若检测目标有效,定位后将其作为 ROI 区域并从原始图像中分离,算法结束。 

校正算法:

图像中的电池字符具有不同的角度朝向,为后续的研究带来了诸多困难。因此需要计算字符倾斜角度,之后实施图像旋转完成校正。其中角度计算是难点所在,若角度计算存在偏差,旋转后也不能
校正。 

 先用合格且字符已完全校正的电池图像作为标准模板,设其为 I0;将其按逆时针方向以 1 度为间隔旋转,生成 360 个图像大小相等,但电池字符倾斜角度各异的模板图像。与标准模板 I0相比,逆时针旋转 1 度,则该图像命名为 I1,逆时针旋转 2 度,则该图像命名为 I2,以此类推,这 360 幅标准图像分别命名为 I1~I360,组成一个模板集,所有图像具有一致尺寸。这种方法类似于模板匹配,但与其不同在于,模板匹配是通过使用模板在待测图像上进行全角度遍历搜索的一种基于最佳相似度的图像辨识方法,本方法每次则直接对两幅同样大小的图像进行相似度比较。

 如图 4.7 所示,具有一定大小的待测电池图像 Ix,其字符逆时针倾斜角度值为 x,将 Ix与这 360幅模板图像一一计算相似度,计算完毕后,求出与之相似度最高的图像 In,n∈{1,2…,360},则旋转角度 θ=n。相似度可通过计算两图像的相关系数获得[35],设相似函数为 S(IA,IB),函数运算后返回 IA与 IB两图像的相似系数值 k=  S(IA,IB),k 值越大,则整体相似程度越高。则设 I,  I’为同分辨率大小图像矩阵,Imn,  Imn’则分别为 I 或 I’第 m 行第 n 列所对应的图像像素值,相似函数 S(I, I’)定义为: 

 计算得到的相关系数值 r 介于±1 之间,|r|值越大,相似度越高;若|r|=1,表示两图像为完全相似。 对于待校正图像 Ix与全角度模板图像 I1~I360分别计算图像相似系数的过程中,可引入最大相似概念,定义最大相似函数 kmax=max{S(Ix,I1),  S(Ix,I2),…, S(Ix,I360)},理论上最大相似函数 kmax所对应的 S(IX,Imax),max 值恰为字符逆时针倾斜角度,Ix应与标准模板集合中字符倾斜角度一致的图像整体相似度最大。 

后续使用图像金字塔的原来进行降采样,提高效率。

字符图像区域定位与分割

1.模板匹配 

 常见的图像匹配有两类情况:一种是根据已有模板图像,在另一幅图像中遍历搜索与模板图像最为接近的目标区域;另一种情况下,则两幅图像来源于不同采集装置、或不同视角与时间,通过图像匹配研究建立两幅图像的对应关系。 

定位到模板区域后,使用两种字符去除算法:

1、通过模板差减法将字符区域直接去除;2、将字符区域与背景区域分离。

模板直接差减算法思路简单,容易实现,但研究中发现其存在很多局限。主要有:1、电池表面字符倾斜校正后,若未能完全校正,存在倾斜误差,则图像字符区域与模板差减后将出现边缘阴影,如图 5.7(a)所示。2、若缺陷恰好覆盖在字符区域,因为模板预先已作粗化处理,则差减后缺陷区域将严重受损,影响后续缺陷特征计算,如图 5.7(b)所示。 

 

有关缺陷检测(图像处理部分)的更多相关文章

  1. ruby - 如何指定 Rack 处理程序 - 2

    Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack

  2. ruby - RuntimeError(自动加载常量 Apps 多线程时检测到循环依赖 - 2

    我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("

  3. ruby-on-rails - 添加回形针新样式不影响旧上传的图像 - 2

    我有带有Logo图像的公司模型has_attached_file:logo我用他们的Logo创建了许多公司。现在,我需要添加新样式has_attached_file:logo,:styles=>{:small=>"30x15>",:medium=>"155x85>"}我是否应该重新上传所有旧数据以重新生成新样式?我不这么认为……或者有什么rake任务可以重新生成样式吗? 最佳答案 参见Thumbnail-Generation.如果rake任务不适合你,你应该能够在控制台中使用一个片段来调用重新处理!关于相关公司

  4. ruby-on-rails - 在 Ruby (on Rails) 中使用 imgur API 获取图像 - 2

    我正在尝试使用Ruby2.0.0和Rails4.0.0提供的API从imgur中提取图像。我已尝试按照Ruby2.0.0文档中列出的各种方式构建http请求,但均无济于事。代码如下:require'net/http'require'net/https'defimgurheaders={"Authorization"=>"Client-ID"+my_client_id}path="/3/gallery/image/#{img_id}.json"uri=URI("https://api.imgur.com"+path)request,data=Net::HTTP::Get.new(path

  5. python ffmpeg 使用 pyav 转换 一组图像 到 视频 - 2

    2022/8/4更新支持加入水印水印必须包含透明图像,并且水印图像大小要等于原图像的大小pythonconvert_image_to_video.py-f30-mwatermark.pngim_dirout.mkv2022/6/21更新让命令行参数更加易用新的命令行使用方法pythonconvert_image_to_video.py-f30im_dirout.mkvFFMPEG命令行转换一组JPG图像到视频时,是将这组图像视为MJPG流。我需要转换一组PNG图像到视频,FFMPEG就不认了。pyav内置了ffmpeg库,不需要系统带有ffmpeg工具因此我使用ffmpeg的python包装p

  6. ruby-on-rails - ActiveRecord 的 find_or_create* 方法是否存在根本性缺陷? - 2

    有几种方法:first_or_create_by、find_or_create_by等,它们的工作原理是:与数据库对话以尝试找到我们想要的东西如果我们找不到,就自己做保存到数据库显然,并发调用这些方法可能会使两个线程都找不到它们想要的东西,并且在第3步中一个线程会意外失败。似乎更好的解决方案是,创建或查找即:提前在您的数据库中创建合理的唯一性约束。如果你想保存一些东西,就保存它如果有效,那就太好了。如果它因为RecordNotUnique异常而无法工作,它已经存在,太好了,加载它那么在什么情况下我想使用Rails内置的东西而不是我自己的(看起来更可靠)create_or_find?

  7. ruby - 是否有将图像文件转换为 ASCII 艺术的命令行程序或库? - 2

    有这样的事吗?我想在Ruby程序中使用它。 最佳答案 试试这个http://csl.sublevel3.org/jp2a/此外,Imagemagick可能还有一些东西 关于ruby-是否有将图像文件转换为ASCII艺术的命令行程序或库?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/6510445/

  8. ruby-on-rails - 使用 Dragonfly 从 URL 分配图像 - 2

    我正在使用Dragonfly在Rails3.1应用程序上处理图像。我正在努力通过url将图像分配给模型。我有一个很好的表格:{:multipart=>true}do|f|%>RemovePicture?Dragonfly的文档指出:Dragonfly提供了一个直接从url分配的访问器:@album.cover_image_url='http://some.url/file.jpg'但是当我在控制台中尝试时:=>#ruby-1.9.2-p290>picture.image_url="http://i.imgur.com/QQiMz.jpg"=>"http://i.imgur.com/QQ

  9. Ruby-vips 图像处理库。有什么好的使用示例吗? - 2

    我对图像处理完全陌生。我对JPEG内部是什么以及它是如何工作一无所知。我想知道,是否可以在某处找到执行以下简单操作的ruby​​代码:打开jpeg文件。遍历每个像素并将其颜色设置为fx绿色。将结果写入另一个文件。我对如何使用ruby​​-vips库实现这一点特别感兴趣https://github.com/ender672/ruby-vips我的目标-学习如何使用ruby​​-vips执行基本的图像处理操作(Gamma校正、亮度、色调……)任何指向比“helloworld”更复杂的工作示例的链接——比如ruby​​-vips的github页面上的链接,我们将不胜感激!如果有ruby​​-

  10. ruby - Faye WebSocket,关闭处理程序被触发后重新连接到套接字 - 2

    我有一个super简单的脚本,它几乎包含了FayeWebSocketGitHub页面上用于处理关闭连接的内容:ws=Faye::WebSocket::Client.new(url,nil,:headers=>headers)ws.on:opendo|event|p[:open]#sendpingcommand#sendtestcommand#ws.send({command:'test'}.to_json)endws.on:messagedo|event|#hereistheentrypointfordatacomingfromtheserver.pJSON.parse(event.d

随机推荐