基于深度学习的工业缺陷检测(早期阶段《二》)

创作缘由

               书接上回,言归正卷,边缘检测来啦!!!加油,有问题请指出,”不必客气“🆒

               本文会将必要的文献等资料整理成压缩包,挂在上面供大家下载。文献资料的名字都会用淡红色给出哦!

               心得:CSDN博客编辑出来的字体或者颜色跟编辑时不一样,可以采取复制到文本编辑器上后再复制过来,再进行编辑下。

-----------------------------------------------------------------------基于深度学习的工业缺陷检测-----------------------------------------------------------------

一、历史发展

  • 20世纪50-60年代:边缘检测的基础理论在这一时期开始形成,最初的边缘检测方法主要有基于微分算子,如Sobel算子和Prewitt算子。这些方法通过计算图像灰度值的变化率来检测边缘,是最早的基于梯度的边缘检测方法。(很多相关的论文都喜欢用这几种边缘检测算法跟Canny算法作比较

     相关文献Roberts L. G. Machine Perception of Three-Dimensional Solids[M]. Optical and Electro-Optical Information Processing, 1965.

       Sobel I., Feldman G. A 3x3 Isotropic Gradient Operator for Image Processing. Presented at a talk at the Stanford Artificial Intelligence Project, 1968.

  • 20世纪70年代:随着计算机图像处理技术的发展,边缘检测技术得到了广泛应用和深入研究。Otsu的方法(1979年)成为一个里程碑,提出了一种基于图像直方图的自动阈值选择方法,极大地提高了图像分割的效果。(自动阈值可以更好的分割前景和背景,突出边缘信息哦)

     相关文献Otsu N. A threshold selection method from gray-level histograms[J]. Automatica, 1975, 11(285-296): 23-27.

  • 20世纪80-90年代自适应阈值方法和多尺度边缘检测方法在这一时期得到发展,研究人员提出了多种改进方法,使得边缘检测在处理复杂图像时表现更加优越。例如,Canny边缘检测算法在1986年提出,并迅速成为经典方法。(Canny边缘检测,算是经典机器视觉一个重量级炸弹,看过的论文几乎都有他的身影,很多创新点都是其延伸,这篇文献推荐指数五颗星

     相关文献Canny J. A computational approach to edge detection[J]. IEEE Transactions on Pattern Analysis and Machine Intelligence, 1986, 8(6): 679-698.

荣誉截图
  • 21世纪至今:随着计算机硬件和计算能力的不断进步,边缘检测技术进入了新的阶段。基于深度学习的方法被广泛应用于图像分割领域,进一步提高了边缘检测的效果和应用范围。(看前提就知道玩深度学习还得靠算力,下面这篇文献讲了关于虚假边缘等问题

     相关文献He K, Gkioxari G, Dollár P, et al. Mask r-cnn[C]//Proceedings of the IEEE international conference on computer vision. 2017: 2961-2969.

二、边缘检测

    1、基本定义

    边缘检测是指通过算法识别和定位图像中灰度(或颜色)变化较大的区域的过程。这些变化区域被称为边缘。具体而言,边缘检测旨在找到图像中一阶导数(梯度)或二阶导数(拉普拉斯)的极大值和极小值,这些点通常对应于图像中物体的轮廓。(灰度值变化较大区域,一阶导、二阶导,所以学好求导,边缘检测基本原理就差不多了,还差百分之九十吧【八】)

     2、作用何在

     我们这个行当属于人工智能下的机器视觉方向,对吧?视觉的来由,其实就是模仿的人的感官嘛,什么机器嗅觉,机器听觉其实都一样。好,那么问题简单了,我们直接利用人的特性来讨论这个问题,假如你在街上寻人,是不是希望找个可以看到全局的地方,去扫视那些外形像人的物体,然后再进行细看是不是你要找的人?(扫视外形像人的物体 就是边缘检测所做的,算是个预处理吧更何况,我们现在用机器视觉做的很多东西,几乎都是物体识别、缺陷检测等等,定位的重要性几乎是不可替代的,既可以提高效率,又可以提高准确性。如今很火的自动驾驶,就报道过一个新闻,就是自动驾驶过程中,把广告上的车误认为前方车辆而刹车,我想很大原因可能就是这个问题。

三、相关算子

    1、Canny 算法

    介绍John F. Canny 于 1986 年提出了该算法,同时提出了边缘检测的三条准则,即良好的边缘检测、 良好的边缘定位和单边缘响应准则。其对噪声非常敏感,所以在其之前滤波显得尤为重要。(1)良好的边缘检测:好的边缘检测算法漏检真正边缘的概率较低,而且将非边缘像素点误检为边缘的概率同样较低。 而漏检或误检都会导致输出图像信噪比降低。(2)单边缘响应:对于同一边缘,应该只有单一响应,即输出一个边缘。(3)良好的边缘定位:被检测出的边缘应该尽可能接近真实边缘。
    核心代码

edges = cv2.Canny(image, 100, 200)  # 100和200分别为低阈值和高阈值
    2、Sobel算子

    介绍::Irwin Sobel 和 Gary Feldman于1968年提出该算法,用于计算图像的水平和垂直梯度,检测图像中的边缘,算是开了边缘检测这一章Sobel 算子基于一阶导数。为了抑制噪声,该算法在计算梯度值时采用局部平均值法。对 x 和 y 两个方向的偏导数, Sobel 算法采用式 1-1 中的两个矩阵与图像做卷积,得到灰度差分值作为 x 和 y 方向导数的近似值。而像素点处的
梯度幅值和方向由式 1-2 计算。得到的梯度图像中的极大值点即为图像边缘。

      核心代码

# 应用Sobel算子
sobelx = cv2.Sobel(image, cv2.CV_64F, 1, 0, ksize=3)  # X方向
sobely = cv2.Sobel(image, cv2.CV_64F, 0, 1, ksize=3)  # Y方向

# 计算梯度幅值
sobel = cv2.magnitude(sobelx, sobely)

     3、Prewitt算子

      介绍Judith Prewitt于1970年提出该算法,计算图像的水平和垂直梯度,类似于Sobel算子,但计算简单。Prewitt 算法是一种基于一阶微分的边缘检测算法,对图像 f(x, y), Prewitt 的定义如下式所示。 Prewitt 算法计算像素点(x, y)周围 8 邻域 x 和 y 向前后两邻点的灰度值之差,灰度差的极值点即为图像边缘。为了减少噪声的影响,该算法在计算灰度差时求取平均数。则 P(x, y)=max[G(x), G(y)]或 P(x, y)=G(x)+G(y)。当 P(x, y)不小于阈值时,则该点即为边缘点。

      核心代码

# 定义Prewitt算子
prewitt_kernel_x = np.array([[1, 0, -1], [1, 0, -1], [1, 0, -1]])
prewitt_kernel_y = np.array([[1, 1, 1], [0, 0, 0], [-1, -1, -1]])

# 应用Prewitt算子
prewittx = cv2.filter2D(image, -1, prewitt_kernel_x)
prewitty = cv2.filter2D(image, -1, prewitt_kernel_y)

# 计算梯度幅值
prewitt = cv2.magnitude(prewittx, prewitty)

       参考文献基于机器视觉的微小零件尺寸测量技术研究_刘国阳

   

      4、Roberts 算法
         介绍Lawrence Roberts于1963年提出该算法,主要用于检测图像中的边缘。它通过计算图像的对角方向梯度来识别边缘。Roberts 算子使用两个 2x2 的卷积核来计算图像的水平和垂直方向的梯度。由于其计算简单,适合实时处理,但对噪声较为敏感,通常适用于噪声较少的图像。

         核心代码

# 定义 Roberts 算子的卷积核
roberts_cross_v = np.array([[1, 0],[0, -1]], dtype=int)
roberts_cross_h = np.array([[0, 1],[-1, 0]], dtype=int)

# 应用 Roberts 算子
vertical = cv2.filter2D(image, -1, roberts_cross_v)
horizontal = cv2.filter2D(image, -1, roberts_cross_h)

# 计算梯度幅值
edges = np.sqrt(np.square(horizontal) + np.square(vertical))
edges = np.uint8(edges)

四、我为人人,人人喂我

           

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值