Canny 边缘提取的目标是找到一个最优的边缘检测算法,最优边缘检测的含义是:

  • 好的检测- 算法能够尽可能多地标识出图像中的实际边缘。
  • 好的定位- 标识出的边缘要尽可能与实际图像中的实际边缘尽可能接近。
  • 最小响应- 图像中的边缘只能标识一次,并且可能存在的图像噪声不应标识为边缘。
    • 算法步骤:

代码运行效果:

源码分析:

 import cv2 as cv
import numpy as np def Canny_edge_demo(image):
blurred = cv.GaussianBlur(image,(3,3),0)
gray = cv.cvtColor(blurred,cv.COLOR_BGR2GRAY)
# x gradient
xgrad = cv.Sobel(gray,cv.CV_16SC1,1,0)
# y gradient
ygrad = cv.Sobel(gray,cv.CV_16SC1,0,1)
"""
Canny(dx, dy, threshold1, threshold2[, edges[, L2gradient]]) -> edges
自定义梯度的Canny算法在图像中查找边缘
"""
edge_output = cv.Canny(xgrad,ygrad,50,150)
cv.imshow("Canny_edge_xygrad",edge_output)
"""
Canny(image, threshold1, threshold2[, edges[, apertureSize[, L2gradient]]]) -> edges
直接调用Canny算法在单通道灰度图像中查找边缘
"""
dst = cv.Canny(gray,50,150)
cv.imshow("Canny_edge_demo",dst) src = cv.imread('smarties.png')
cv.namedWindow('input_image',cv.WINDOW_AUTOSIZE)
cv.imshow('input_image',src) Canny_edge_demo(src) cv.waitKey(0)
cv.destroyAllWindows()

注意:

OpenCV的Canny函数用于在图像中查找边缘,其函数原型有两种:

直接调用Canny算法在单通道灰度图像中查找边缘

其函数原型为:Canny(image, threshold1, threshold2[, edges[, apertureSize[, L2gradient]]]) -> edges

image参数表示8位输入图像。

threshold1参数表示设置的低阈值。

threshold2参数表示设置的高阈值,一般设定为低阈值的3倍 (根据Canny算法的推荐)。

edges参数表示输出边缘图像,单通道8位图像。

apertureSize参数表示Sobel算子的大小。

L2gradient参数表示一个布尔值,如果为真,则使用更精确的L2范数进行计算(即两个方向的倒数的平方和再开方),否则使用L1范数(直接将两个方向导数的绝对值相加)。

使用带自定义图像渐变的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范数(直接将两个方向导数的绝对值相加)。

参考:

Canny算子原理:

https://www.cnblogs.com/techyan1990/p/7291771.html

http://www.opencv.org.cn/opencvdoc/2.3.2/html/doc/tutorials/imgproc/imgtrans/canny_detector/canny_detector.html

https://blog.csdn.net/sunny2038/article/details/9202641

https://www.cnblogs.com/FHC1994/p/9133015.html

【python-opencv】19-Canny边缘检测的更多相关文章

  1. OpenCV图像Canny边缘检测

    Canny边缘检测 图像的边缘检测的原理是检测出图像中所有灰度值变化较大的点,而且这些点连接起来就构成了若干线条,这些线条就可以称为图像的边缘函数原型:     void cvCanny(       ...

  2. Python+OpenCV图像处理(十三)—— Canny边缘检测

    简介: 1.Canny边缘检测算子是John F. Canny于 1986 年开发出来的一个多级边缘检测算法. 2.Canny 的目标是找到一个最优的边缘检测算法,最优边缘检测的含义是: 好的检测- ...

  3. OpenCV: Canny边缘检测算法原理及其VC实现详解(转载)

    原文地址:http://blog.csdn.net/likezhaobin/article/details/6892176 原文地址:http://blog.csdn.net/likezhaobin/ ...

  4. openCV(四)---Canny边缘检测

    图像的边缘检测的原理是检测出图像中所有灰度值变化较大的点,而且这些点连接起来就构成了若干线条,这些线条就可以称为图像的边缘. 直接上代码,函数简介都在代码注释中 //canny边缘检测 -(void) ...

  5. 基于opencv下对视频的灰度变换,高斯滤波,canny边缘检测处理,同窗体显示并保存

    如题:使用opencv打开摄像头或视频文件,实时显示原始视频,将视频每一帧依次做灰度转换.高斯滤波.canny边缘检测处理(原始视频和这3个中间步骤处理结果分别在一个窗口显示),最后将边缘检测结果保存 ...

  6. OpenCV——边缘检测入门、Canny边缘检测

    边缘检测的一般步骤: 最优边缘检测的三个评价标准: 低错误率:表示出尽可能多的实际边缘,同时尽可能地减少噪声产生的误报: 高定位性:标识出的边缘要与图像实际边缘尽可能接近: 最小响应:图像中的边缘只能 ...

  7. OpenCV学习代码记录——canny边缘检测

    很久之前学习过一段时间的OpenCV,当时没有做什么笔记,但是代码都还在,这里把它贴出来做个记录. 代码放在码云上,地址在这里https://gitee.com/solym/OpenCVTest/tr ...

  8. openCV实例:Canny边缘检测

    http://blog.sina.com.cn/s/blog_737adf530100z0jk.html 在第一次使用openCV程序成功对图像进行打开后,现在开始试验第二个例程试验:Canny边缘检 ...

  9. OpenCV学习笔记(11)——Canny边缘检测

    了解Canny边缘检测的概念 1.原理 Canny边缘检测是一种非常流行的边缘检测算法,是 John F.Canny在1986年提出的.它是一个有很多步构成的算法 1)噪声去除 使用5*5的高斯滤波器 ...

  10. Canny边缘检测算法(基于OpenCV的Java实现)

    目录 Canny边缘检测算法(基于OpenCV的Java实现) 绪论 Canny边缘检测算法的发展历史 Canny边缘检测算法的处理流程 用高斯滤波器平滑图像 彩色RGB图像转换为灰度图像 一维,二维 ...

随机推荐

  1. [NodeJS] Node.js 与 V8 的故事

    要说Node.js的历史,就不得不说说V8历史.在此之前我们先一句话描述一下什么是Node.js:Node.js是一个基于Google Chrome V8 Javascript引擎之上的平台,用以创建 ...

  2. 给TextView加上多彩效果:改变部分字体的大小和颜色

    转载请注明出处:http://blog.csdn.net/singwhatiwanna/article/details/18363899 前言 在实际使用中,有时候会遇到特殊需求,比如pm突发奇想,想 ...

  3. Python进阶 学习笔记(三)

    (涉及内容:定制类) __str__和__repr__ 如果要把一个类的实例变成 str,就需要实现特殊方法__str__(): class Person(object): def __init__( ...

  4. Mac下Intellij IDea发布JavaWeb项目 详解一 (1、新建JavaEE Project并进行相应设置 2、配置tomcat)

    IDEA中 javaWeb项目的创建和tomcat配置(完整) 1.先新建JavaEE Project并进行相应设置 2.在配置tomcat Step1 新建JavaEE Project并进行相应设置 ...

  5. 119、 android:hardwareAccelerated="true"or"false"硬件加速的重要性

    每次做项目都会遇见一些特别简单的问题,但是又很费时间来让你解决的问题. 1.本身想实现一个简单的画廊效果,可是每次图片的显示都不能显示在正中的位置,真的很烦人,也花费了很长时间.最终还是知道了原因.解 ...

  6. Linux下Apache网站目录读写权限的设置

    网站目录文件权限的设置对网站的安全至关重要,下面简单介绍网站目录文件权限的基本设定. 我们假设http服务器运行的用户和用户组是www,网站用户为centos,网站根目录是/home/centos/w ...

  7. OpenCV——识别各省份地图轮廓

    好久没有发OpenCV的博客了,最近想到了一个识别地图轮廓的方案,就写来试试.(识别中国的28个省份地图轮廓,不考虑直辖市) 首先,我的基本思路是  用最小的矩形将地图的轮廓圈出来,可以根据长方形的长 ...

  8. [微信小程序]计算自己手机到指定位置的距离

    目的: 根据目的地的坐标计算自己手机的位置离目的地的距离的 核心思路: 后续操作必须等所有异步请求都返回了才能继续 使用 const qqmap = require("../../utils ...

  9. C# 中文日期 周几

    //该语句显示的为英文格式 DateTime.Now.DayOfWeek.ToString(); //显示中文格式星期几 "星期" + DateTime.Now.ToString( ...

  10. maven中pom文件中name字段的作用