关于Canny 边缘检测 、OTSU 图像分割方法、OpenCV + Python 实现人脸检测

您所在的位置:网站首页 边缘检测算法对比 关于Canny 边缘检测 、OTSU 图像分割方法、OpenCV + Python 实现人脸检测

关于Canny 边缘检测 、OTSU 图像分割方法、OpenCV + Python 实现人脸检测

2024-06-09 13:28| 来源: 网络整理| 查看: 265

数字图像处理综合实验报告 一、Canny边缘检测

我们可以直接使用一阶导数算子或者二阶导数算子对图像做卷积来提取图像的边缘,但是这些做法有一定的缺点,一方面是检测的正确率不够高,另一方面提取的边缘不是单像素长的。Canny边缘检测是一种更高级的方法,可以解决上述问题。

Canny边缘检测算法基于如下三个目标提出:

低错误率边缘点应被很好地定位单个边缘点响应

Canny算法并不是简单地使用某个卷积核来过滤图像,而是有一套步骤的,Canny算法的步骤大致可以分为如下四步:

高斯滤波(降低噪声,防止虚假边缘)计算图像的梯度和梯度方向对梯度图像应用非极大值抑制使用双阈值处理和连通性分析来检测与连接边缘

其中前两个步骤相当于是朴素的边缘检测算法,第三个步骤是为了将边缘固定为单像素宽,第四个步骤是为了剔除假边缘

详细说明

详细的步骤解释说明如下:

将原始的图像数据与高斯mask作卷积。利用高斯平滑对图像降噪,方便后续的处理使用Sobel算子滤波,获得x和y方向上的输出,在此基础上求出边缘的强度和角度。其中的强度可由fx与fy的平方和开根号得到,角度则可由fy与fx1的比值取arctan得到。对边缘角度进行量化处理。直接使用arctan得到的角度计算过于复杂,故可将角度以45度为界划分为0,45,90,135.其中-0.4142 < tan < 0.4142,其余以此类推。根据边缘角度对边缘强度进行非极大值抑制,细化图像边缘。仅得到全局的梯度不足以确定边缘,必须保留局部梯度最大的点,抑制非极大值。例如,当0度时,取(x,y)、(x+1,y)、(x-1,y)的最大值。使用双阈值算法检测和连接边缘。减少假边缘段数量的典型方法是对N[i,j]使用一个阈值,将低于阈值的所有值赋零值。双阈值算法对非极大值抑制图象作用两个阈值τ1和τ2,且2τ1≈τ2,从而可以得到两个阈值边缘图象N1[i,j]和N2[i,j]。由于N2[i,j]使用高阈值得到,因而含有很少的假边缘,但有间断(不闭合)。双阈值法要在N2[i,j]中把边缘连接成轮廓,当到达轮廓的端点时,该算法就在N1[i,j]的8邻点位置寻找可以连接到轮廓上的边缘,这样,算法不断地在N1[i,j]中收集边缘,直到将N2[i,j]连接起来为止。 代码实现 import math import numpy as np import cv2 def myCanny(image, tl, th): #Gauss Blur image = cv2.GaussianBlur(image, (5,5), 3.0, sigmaY=3.0) print('Gauss Blur down') #Gradient Calculation gx = cv2.Sobel(image,cv2.CV_16S,1,0) gy = cv2.Sobel(image,cv2.CV_16S,0,1) m = (gx*gx + gy*gy) ** 0.5 theta = np.zeros(m.shape) for x in range(0, m.shape[0]): for y in range(0, m.shape[1]): if(gx[x][y] == 0): theta[x][y] = math.pi/2 else: theta[x][y] = math.atan(gy[x][y]/gx[x][y]) print('Gradient Calculation down') #Non-Maximum Suppression gn = m.copy() for x in range(0, m.shape[0]): for y in range(0, m.shape[1]): if math.pi * -1/8


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3