图像边缘检测算法的原理,数字图像处理边缘检测算法

  图像边缘检测算法的原理,数字图像处理边缘检测算法

  本文主要介绍了图像边缘检测算法的原理及其在python中的实现。本文中的示例代码非常详细,具有一定的参考价值。感兴趣的朋友可以参考一下。

  00-1010写在前面1。一阶微分算子1.1 Prewitt算子1.2 Sobel算子2。二阶微分算子2.1拉普拉斯算子2.2对数算子3。Canny边缘检测

  

目录

  从这一节开始,计算机视觉的课程进入第三章,——图像特征提取。在这一章中,你会看到一张简单的图片包含了这么多你没有注意到的细节特征,而这些特征将在未来更高级的应用中发挥极其重要的作用。本文解释了3354图像的一个基本特征:边缘。

  本文通过面向对象的设计定义了一个边缘检测类EdgeDetect,使得图像边缘检测算法的应用更加简洁,如

  导入cv2

  将numpy作为np导入

  将matplotlib.pyplot作为plt导入

  Detector=EdgeDetect(1.jpg )

  Prewitt=Detector.prewitt()

  plt.imshow(普鲁伊特,“灰色”)

  plt.show()

  这个类的构造函数是

  EdgeDetect:类

  def __init__(self,img) - None:

  self.src=cv2.imread(img)

  self . gray=cv2 . CVT color(self . src,cv2。COLOR_BGR2GRAY)

  读取图像的基本信息。

  

写在前面

  图像边缘是数字图像的高频成分,对应于图像梯度的极值。在二维离散数字图像上,某一方向的图像强度函数微分用有限差分法近似,即:

  因此,图像边缘检测就是图像的差分运算。

  

1.一阶微分算子

  Prewitt算子本质上是X或Y方向上相邻像素的差值。

  我们说的图像渐变是什么意思?

  实际上,X和Y方向上相邻像素之间的差异被用来划分方向向量。

  在编程实现上,就是构造上图两个方向的滤波算子,然后合成x xx和y yy两个方向的边缘,就是整个图各个方向的边缘检测结果。

  def prewitt(自我):

  # Prewitt算子

  kernelX=np.array([[1,1,1],[0,0,0],[-1,-1,-1]],dtype=int)

  kernelY=np.array([[-1,0,1],[-1,0,1],[-1,0,1]],dtype=int)

  #过滤图像

  x=cv2.filter2D(self.gray,cv2。CV_16S,kernelX)

  y=cv2.filter2D(self.gray,cv2。CV_16S,kernelY)

  #转向uint8,图像融合

  absX=cv2.convertScaleAbs(x)

  absY=cv2.convertScaleAbs(y)

  返回cv2.addWeighted(absX,0.5,absY,0.5,0)

  

1.1 Prewitt算子

  推导高斯核函数的x、y方向,并模板化得到Sobel算子。Sobel算子比Prewitt算子具有更强的抗噪能力,因为它结合了高斯滤波的效果。

  在编程实现上,就是构造上图两个方向的滤波算子,然后将X和Y方向的边合成为整个图各个方向的边。

  检测结果

  

def sobel(self):

   # Sobel 算子

   kernelX = np.array([[1, 2, 1],[0, 0, 0],[-1, -2, -1]],dtype=int)

   kernelY = np.array([[-1, -2, -1],[0, 0, 0],[1, 2, 1]],dtype=int)

   # 对图像滤波

   x = cv2.filter2D(self.gray, cv2.CV_16S, kernelX)

   y = cv2.filter2D(self.gray, cv2.CV_16S, kernelY)

   # 转 uint8 ,图像融合

   absX = cv2.convertScaleAbs(x)

   absY = cv2.convertScaleAbs(y)

   return cv2.addWeighted(absX, 0.5, absY, 0.5, 0)

  

  

  

  

2.二阶微分算子

  

  

2.1 Laplace算子

  将Laplace算子

  

  写成差分方程形式为

  

  将差分方程进一步写成卷积核形式如图(a),可将其扩展为图(b)使之具有各向同性。微分算子属于高通滤波,在锐化边缘的同时也增强了噪点,因此Laplace算子抗噪能力弱,且不能检测边缘方向。

  

  在编程实现上,就是构造上图的滤波算子

  

# Laplace 算子

  def laplace(self):

   kernel = np.array([[0, -1, 0], [-1, 4, -1], [0, -1, 0]], dtype=int)

   img = cv2.filter2D(self.gray, cv2.CV_16S, kernel)

   return cv2.convertScaleAbs(img)

  

  

  

  

2.2 LoG算子

  为克服Laplace算子抗噪能力弱这一问题,引入高斯-拉普拉斯算子(LoG, Laplace of Gaussian),即先低通滤除噪声,再高通强化边缘,LoG算子本质上是带通滤波器。

  

  在编程实现上,就是构造上图的滤波算子

  

# LoG算子

  def LoG(self):

   kernel = np.array([[0, 0, 1, 0, 0], [0, 1, 2, 1, 0], [1, 2, -16, 2, 1], [0, 1, 2, 1, 0], [0, 0, 1, 0, 0]], dtype=int)

   img = cv2.filter2D(self.gray, cv2.CV_16S, kernel)

   return cv2.convertScaleAbs(img)

  

  

  

  

3.Canny边缘检测

  Canny边缘检测算法可以分为以下步骤。

  

  • 使用Sobel算子滤除原图像噪声,并得到梯度图;
  • 应用非极大值抑制(Non-Maximum Suppression, NMS)以消除边缘检测、目标检测带来的杂散响应,即对待测边缘或目标,应尽可能有唯一的准确响应
  • 应用双阈值(Double-Threshold)检测来确定真实的和潜在的边缘。

  使用如下双阈值检测算法解决因噪声引起的杂散边缘响应。

  

  阈值的选择取决于给定输入图像的内容。下面对弱边缘进一步审查,即

  

  通常,由真实边缘引起的弱边缘像素将连接到强边缘像素,而噪声响应未连接。为了跟踪边缘连接,通过查看弱边缘像素的8个邻域像素是否存在强边缘像素,来决定是否滤除该弱边缘点。

  下面是Canny边缘检测算法的效果。

  

  到此这篇关于详解Python中图像边缘检测算法的实现的文章就介绍到这了,更多相关Python图像边缘检测算法内容请搜索盛行IT软件开发工作室以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT软件开发工作室!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: