canny算法

Canny 算法快速实现 opencv

你说的曾经没有我的故事 提交于 2020-03-21 10:53:36
一. 算法原理: 可参考: https://www.cnblogs.com/wojianxin/p/12533526.html https://www.jianshu.com/p/ff4c1a6a68d8 二. opencv 函数 cv.Canny 快速实现 Canny 边缘检测算法(必须先搞懂算法流程,才能正确使用该函数): opencv 官方文档 函数说明 ↑ 参数说明,有不懂的参数可参考第一部分的链接。 ↑ 三. 使用函数快速进行边缘检测 1 import cv2 2 3 import numpy as np 4 5 from matplotlib import pyplot as plt 6 7 img = cv2.imread('../head_g.jpg',0) 8 9 # 80以下被归为0,200以上被归为255 10 11 edges = cv2.Canny(img,80,200) 12 13 plt.subplot(121),plt.imshow(img,cmap = 'gray') 14 15 # plt.xticks([]) 不显示x轴 16 17 plt.title('Original Image'), plt.xticks([]), plt.yticks([]) 18 19 plt.subplot(122),plt.imshow(edges,cmap =

opencv学习笔记17-Canny算法

时光怂恿深爱的人放手 提交于 2020-02-29 14:23:18
只用来记录学习笔记 Canny算法 int t1_value = 50 ; const char * OUTPUT_TITLE = "Canny Result" ; cvtColor ( src , gray_src , CV_BGR2GRAY ) ; //转灰度图像 blur ( gray_src , gray_src , Size ( 3 , 3 ) , Point ( - 1 , - 1 ) , BORDER_DEFAULT ) ; //模糊 Canny ( gray_src , edge_output , t1_value , t1_value * 2 , 3 , false ) ; //gray_src:灰度图像 //edge_output //t1_value:低阈值 //t1_value * 2:高阈值 //3:孔径大小 imshow ( OUTPUT_TITLE , edge_output ) ; 效果图: 来源: CSDN 作者: 没有改不了的bug 链接: https://blog.csdn.net/weixin_44177447/article/details/104572510

opencv-python中Canny算子边缘检测详解

▼魔方 西西 提交于 2020-02-21 17:47:16
Canny算子是一种非常流行的边缘检测算法,在opencv中直接提供给了我们Canny函数,但是我们还是有必要对其原理有一定的了解。 原理 Canny算子包含四步操作: 去噪 首先要去除图像的噪声,边缘检测很容易受到噪声的影响。去噪操作中我们使用的是5*5的高斯滤波器。 计算梯度 在这一步要计算图像的梯度。不但要计算梯度的大小,还要求出梯度的方向。梯度的方向被归为四类:水平,垂直,两条对角线方向。 计算图像梯度的大小和方向的公式如下: 非极大值抑制 经过以上操作得出的边界是非常粗糙且精度低的。我们需要在计算出梯度的大小和方向之后对整幅图像的像素点进行遍历。去除那些不在边界上的点。 对每一个像素点进行检查,看它是否是周围同方向梯度的点中梯度最大的。如果是最大的,就保留,如果不是,就抑制(归0) 如图,黄色点被保留,白色点被抑制。 滞后阈值 这是确定点是否在边界上的最后一关。我们设置两个阈值(maxVal,minVal) 凡是梯度大于maxVal的点我么就认为这个点处在边界上,保留 梯度值大于minVal小于maxVal的点,如果这个点与某个确定为边界的点相连,保留;否则就抛弃 梯度值小于minVal的点,全部抛弃 经过这四步操作,我们就可以得到所想要的真正边界。 函数 OpenCV中提供给我们现成的函数: cv2 . Canny ( sec , minVal , maxVal )

opencv python:Canny边缘提取

陌路散爱 提交于 2020-01-31 01:37:09
Canny是边缘提取算法,在1986年提出的 是一个很好的边缘检测器 Canny算法介绍 非最大信号抑制: 高低阈值连接: example import cv2 as cv import numpy as np # canny运算步骤:5步 # 1. 高斯模糊 - GaussianBlur # 2. 灰度转换 - cvtColor # 3. 计算梯度 - Sobel/Scharr # 4. 非极大值抑制 # 5. 高低阈值输出二值图像 # 非极大值抑制: # 算法使用一个3×3邻域作用在幅值阵列M[i,j]的所有点上; # 每一个点上,邻域的中心像素M[i,j]与沿着梯度线的两个元素进行比较, # 其中梯度线是由邻域的中心点处的扇区值ζ[i,j]给出。 # 如果在邻域中心点处的幅值M[i,j]不比梯度线方向上的两个相邻点幅值大,则M[i,j]赋值为零,否则维持原值; # 此过程可以把M[i,j]宽屋脊带细化成只有一个像素点宽,即保留屋脊的高度值。 # 高低阈值连接 # T1,T2为阈值,凡是高于T2的都保留,凡是低于T1的都丢弃 # 从高于T2的像素出发,凡是大于T1而且相互连接的都保留。最终得到一个输出二值图像 # 推荐高低阈值比值为T2:T1 = 3:1/2:1,其中T2高阈值,T1低阈值 def edge_demo(image): blurred = cv

使用python实现canny算法

╄→гoц情女王★ 提交于 2020-01-13 07:08:45
1. Canny算法概述 Canny边缘检测算子是John F. Canny于 1986 年开发出来的一个多级边缘检测算法。更为重要的是 Canny 创立了边缘检测计算理论(Computational theory of edge detection)解释这项技术如何工作。 通常情况下边缘检测的目的是在保留原有图像属性的情况下,显著减少图像的数据规模。有多种算法可以进行边缘检测,虽然Canny算法年代久远,但可以说它是边缘检测的一种标准算法,而且仍在研究中广泛使用。 2.最优边缘准则 Canny 的目标是找到一个最优的边缘检测算法,最优边缘检测的含义是: (1)最优检测:算法能够尽可能多地标识出图像中的实际边缘,漏检真实边缘的概率和误检非边缘的概率都尽可能小; (2)最优定位准则:检测到的边缘点的位置距离实际边缘点的位置最近,或者是由于噪声影响引起检测出的边缘偏离物体的真实边缘的程度最小; (3)检测点与边缘点一一对应:算子检测的边缘点与实际边缘点应该是一一对应。 为了满足这些要求 Canny 使用了变分法(calculus of variations),这是一种寻找优化特定功能的函数的方法。最优检测使用四个指数函数项表示,但是它非常近似于高斯函数的一阶导数。 2. Canny算法实现步骤 第一步:灰度化 第二步:高斯滤波 任何边缘检测算法都不可能在未经处理的原始数据上很好地工作

图像处理_Canny算法

你。 提交于 2019-12-11 02:18:27
Canny算子求边缘点具体算法步骤如下: 1. 用高斯滤波器平滑图像. 2. 用一阶偏导有限差分计算梯度幅值和方向. 3. 对梯度幅值进行非极大值抑制. 4. 用双阈值算法检测和连接边缘. 4.1.双阈值的选取 4.2.滞后边界跟踪 第一步:高斯滤波 int TempltExcuteAsh(BYTE** imageBuf0, int w, int h, int* templt, int tw, int x, int y) { int i, j; int m = 0; int px, py; //依次对邻域中每个像素进行运算 for (i = 0; i < tw; i++){ for (j = 0; j < tw; j++){ //计算对应模板上位置的像素在源图像中的位置, 此处tw是int,则tw/2也是int py = y - (int)tw / 2 + i; px = x - (int)tw / 2 + j; //加权求和 m += imageBuf0[py][px] * templt[i * tw + j]; } } return m; } static void SmoothGaussAsh(BYTE* image0, BYTE* image1, UINT w, UINT h) { BYTE** imageBuf0 = CreateImage(image0, w, h);

Canny算法检测边缘

匿名 (未验证) 提交于 2019-12-03 00:13:02
  Canny算法是边缘检测的一个经典算法,比单纯用一些微分算子来检测的效果要好很多,其优势有以下几点: 边缘误检与漏检率低。 边缘定位准确,且边界较细。 自带一定的滤噪功能,或者说,对噪声的敏感度要比单纯算子低。 具有多个可调整参数,可影响算法的时间与时效。   但是Canny相比单纯算子来说计算量偏大,下面简单介绍算法的过程。 图像去噪:       这一步不是必须的,一般噪声少的图,让Canny自己应付就行。若噪声较多,一般采用高斯滤波。滤波后,噪声灰度下降,对边缘的影响   小于噪点。 获取梯度强度与方向:       用一阶微分算子获取梯度强度和方向,如sobel算子,强度与方向公式如下:          要用两个矩阵分别存储强度和方向,其中方向公式需要根据具体算子情况更改正负号,最终使上下左右、45度方向可以区分开来。例如下图所示,     这里将上下放在(60,90)和(-90,-60)区间,因为它们在非极大抑制时取的都是上下邻域;将左右放在(-30,30)区间,因为它们抑制时取的是     左右邻域;将处于斜向上对角线的梯度角放在(30,60),它们在抑制时取45度的两个邻域;将斜向下对角线上的梯度角放在(-60,-30),它们在     抑制时取-45度的两个邻域。      非极大抑制:      该步骤目的是删除非边缘像素,主要做法是对每个像素点

ITK中的图像类型转换问题

大兔子大兔子 提交于 2019-11-26 12:14:59
之前一直很奇怪,ITK的图像类型可以自定义,从uchar到double都可以,那这么做到底有什么意义,难道直接用uchar不好么。 今天用canny edge detection和binary morphological closing的时候发现,canny filter的输出像素必须是float类型的,而binary morphological filter输入输出必须是uchar类型的,所以itk里面的图像自定义类型估计是为了兼容这么多来自不同种族的算法函数吧… // binary morphological filter using StructuringElementType = itk :: BinaryBallStructuringElement < ImageTypeUchar :: PixelType , ImageTypeUchar :: ImageDimension > ; StructuringElementType structuringElement ; structuringElement . SetRadius ( 5 ) ; structuringElement . CreateStructuringElement ( ) ; using BinaryMorphologicalClosingImageFilterType = itk ::