OpenCV---Canny边缘提取
一:Canny算法介绍
Canny 的目标是找到一个最优的边缘检测算法,最优边缘检测的含义是: 好的检测- 算法能够尽可能多地标识出图像中的实际边缘。 好的定位- 标识出的边缘要尽可能与实际图像中的实际边缘尽可能接近。 最小响应- 图像中的边缘只能标识一次,并且可能存在的图像噪声不应标识为边缘。
推文:Canny边缘检测算法原理及其VC实现详解(一)
1.高斯模糊--GaussianBlur 消除噪声。 一般情况下,使用高斯平滑滤波器卷积降噪。,因为canny是对噪声敏感的算法,所以先降噪,但是降噪不要太过,以免丢失 2.灰度转换--cvtColor 3.计算梯度--Sobel/Scharr 4.非最大信号抑制 5.高低阈值输出二值图像
补充:
非最大信号抑制
在Canny算法中,非极大值抑制是进行边缘检测的重要步骤,通俗意义上是指寻找像素点局部最大值,将非极大值点所对应的灰度值置为0
sobel算子中有一个x,y 根据x,y可以求出一个θ角度
1.要进行非极大值抑制,就首先要确定像素点C的灰度值在其8值邻域内是否为最大。是最大则下一步
2.图中蓝色的线条方向为C点的梯度方向,这样就可以确定其局部的最大值肯定分布在这条线上,也即出了C点外,梯度方向的交点dTmp1和dTmp2这两个点的值也可能会是局部最大值。 因此,判断C点灰度与这两个点灰度大小即可判断C点是否为其邻域内的局部最大灰度点。
3.如果经过判断,C点灰度值小于这两个点中的任一个,那就说明C点不是局部极大值,那么则可以排除C点为边缘。
完成非极大值抑制后,会得到一个二值图像,非边缘的点灰度值均为0,可能为边缘的局部灰度极大值点可设置其灰度为128。根据下文的具体测试图像可以看出,这样一个检测结果还是包含了很多由噪声及其他原因造成的假边缘。因此还需要进一步的处理。
高低阈值输出二值图像
二:Canny边缘提取实现
def edge_demo(image):#1.高斯模糊blurred = cv.GaussianBlur(image,(3,3),0)#2.灰度转换gray = cv.cvtColor(blurred,cv.COLOR_RGB2GRAY)#3.计算梯度xgrad = cv.Sobel(gray,cv.CV_16SC1,1,0) #canny方法API要求不允许使用浮点数ygrad = cv.Sobel(gray,cv.CV_16SC1,0,1)#4.Canny方法中包含非最大信号抑制和双阈值输出edge_output = cv.Canny(xgrad,ygrad,50,150) #50是低阈值,150是高阈值cv.imshow("Canny Edge",edge_output)dst = cv.bitwise_and(image,image,mask=edge_output) #相与,获取颜色cv.imshow("Color Edge",dst)src = cv.imread("./g.png") #读取图片
cv.namedWindow("input image",cv.WINDOW_AUTOSIZE) #创建GUI窗口,形式为自适应
cv.imshow("input image",src) #通过名字将图像和窗口联系edge_demo(src)cv.waitKey(0) #等待用户操作,里面等待参数是毫秒,我们填写0,代表是永远,等待用户操作
cv.destroyAllWindows() #销毁所有窗口
使用Canny计算梯度
def edge_demo(image):#1.高斯模糊blurred = cv.GaussianBlur(image,(3,3),0)#2.灰度转换gray = cv.cvtColor(blurred,cv.COLOR_RGB2GRAY)#3.直接传入灰度图像,Canny方法中包含计算梯度,非最大信号抑制和双阈值输出edge_output = cv.Canny(gray,50,150) #50是低阈值,150是高阈值cv.imshow("Canny Edge",edge_output)dst = cv.bitwise_and(image,image,mask=edge_output)cv.imshow("Color Edge",dst)
相关知识补充
(一)Canny方法
(1)需要我们求出梯度
Canny(dx, dy, threshold1, threshold2[, edges[, L2gradient]]) -> edges
使用带自定义图像渐变的Canny算法在图像中查找边缘,
其函数原型为:Canny
(dx, dy, threshold1, threshold2[, edges[, L2gradient]]) -> edges
dx参数表示输入图像的x导数(x导数满足16位,选择CV_16SC1或CV_16SC3)
dy参数表示输入图像的y导数(y导数满足16位,选择CV_16SC1或CV_16SC3)。
threshold1参数表示设置的低阈值。
threshold2参数表示设置的高阈值,一般设定为低阈值的3倍 (根据Canny算法的推荐)。
edges参数表示输出边缘图像,单通道8位图像。
L2gradient参数表示L2gradient参数表示一个布尔值,如果为真,则使用更精确的L2范数进行计算(即两个方向的倒数的平方和再开方),否则使用L1范数(直接将两个方向导数的绝对值相加)。
(2)直接调用Canny算法在单通道灰度图像中查找边缘,
def Canny(image, threshold1, threshold2, edges=None, apertureSize=None, L2gradient=None): # real signature unknown; restored from __doc__
image参数表示8位输入图像。threshold1参数表示设置的低阈值。threshold2参数表示设置的高阈值,一般设定为低阈值的3倍 (根据Canny算法的推荐)。edges参数表示输出边缘图像,单通道8位图像。apertureSize参数表示Sobel算子的大小。L2gradient参数表示一个布尔值,如果为真,则使用更精确的L2范数进行计算(即两个方向的倒数的平方和再开方),否则使用L1范数(直接将两个方向导数的绝对值相加)。
OpenCV---Canny边缘提取相关推荐
- python canny 保留指定区域的轮廓线_opencv python Canny边缘提取实现过程解析
这篇文章主要介绍了opencv python Canny边缘提取实现过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 Canny是边缘提取算法 ...
- OpenCV——canny算子
1. opencv--Canny算子 Canny 的目标是找到一个最优的边缘检测算法,最优边缘检测的含义是: 最好的检测: 算法能够尽可能多地标识出图像中的实际边缘. 最好的定位: 标识出的边缘要尽可 ...
- OpenCV Canny边缘检测的实例(附完整代码)
OpenCV Canny边缘检测的实例 OpenCV Canny边缘检测的实例 OpenCV Canny边缘检测的实例 #include "opencv2/core/utility.hpp& ...
- OpenCV——Canny直线检测
目录 前言 正文 原理 高斯滤波过滤 计算像素点的梯度方向(Sobel算子) 非极大值抑制 用双阈值算法检测和连接边缘 通过抑制孤立的弱边缘最终完成边缘检测 代码 参考文献 前言 Canny边缘检测是 ...
- opencv Canny边缘检测用法
<span style="color:#000080">1. cv2.Canny(image, threshold1, threshold2[, edges[, ape ...
- 十四、Canny边缘提取
一.算法步骤 1,对图像进行GaussianBlur(高斯模糊)消除一些噪声 2,对图像进行灰度转换cvtColor 3,计算梯度Sobel/Scharr 4,非最大信号抑制 5,高低阈值输出二值图像 ...
- (九)OpenCV Canny边缘检测
1.基础原理 参考自<数字图象处理>第十章 及OpenCV Tutorial Canny Edge Detector 1.1边缘检测概述 边缘检测是根据灰度突变来分割图像的一种常用方法.边 ...
- Python cv2(Opencv) Canny边缘检测 和 傅里叶变换
简介: OpenCV是一个基于Apache2.0许可(开源)发行的跨平台计算机视觉和机器学习软件库,可以运行在Linux.Windows.Android和Mac OS操作系统上.它轻量级而且高效,由一 ...
- opencv Canny算子
叙述Canny()函数,这个函数是拿来边缘检测的,最好是高定位低出错. 第一个参数:srcImage,注意要是8位.这个要求和自适应阈值化函数的要求一样. 第二个参数:dstImage,要和srcIm ...
- python canny 保留指定区域的轮廓线_opencv python:Canny边缘提取
Canny是边缘提取算法,在1986年提出的 是一个很好的边缘检测器 Canny算法介绍 非最大信号抑制: 高低阈值连接: example import cv2 as cv import numpy ...
最新文章
- C++编程进阶8(最好不要实现类型转换运算符、单形参的构造函数与类型转换、临时对象与RVO)
- Postgresql中文排序
- [渝粤教育] 西南科技大学 投资经济学 在线考试复习资料(2)
- 【转】C++中的字符串(String)和数值转换
- 能力=知识+技能+经验
- Ubuntu 安装配置 ROR3
- CXF框架介绍及Spring集成
- 关闭Ubuntu错误报告
- linux内核mtd驱动程序与sd卡驱动程序,Linux内核MTD驱动程序及SD卡驱动程序.doc
- 在Linux下进入目录,目录下创建、修改、删除文件所需权限
- bilibili ,B站视频预览缩略图实现分析
- 2020switch电信最快的dns_《2020switch电信最快的dns》电影_2020switch电信最快的dns正片免费观看-深圳市创业发科技有限公司...
- 游戏开发工具引擎/模拟器收集
- feedburner怎么用_新手RSS订阅使用指南
- 让自己的电脑会说话||让电脑在开机时说话
- 高通平台耳机类型识别
- 真无线蓝牙耳机哪款适合新手?数码发烧友最全盘点,高实用性蓝牙耳机
- 一级建造师考试备考顺序
- 基于asp.net742自驾游旅游服务网站的设计
- 多个微信服务号对接一个微信商户号流程