Python如何使用cv2.canny进行图像边缘检测

目录
  • 使用cv2.canny进行图像边缘检测
    • 阈值对检测结果的影响
    • sobel算子对检测结果的影响
    • 范数对检测结果的影响
  • 总结

使用cv2.canny进行图像边缘检测

CV2提供了提取图像边缘的函数canny。

其算法思想如下:

  • 1.使用高斯模糊,去除噪音点(cv2.GaussianBlur)
  • 2.灰度转换(cv2.cvtColor)
  • 3.使用sobel算子,计算出每个点的梯度大小和梯度方向
  • 4.使用非极大值抑制(只有最大的保留),消除边缘检测带来的杂散效应
  • 5.应用双阈值,来确定真实和潜在的边缘
  • 6.通过抑制弱边缘来完成最终的边缘检测

Canny函数的定义如下:

edge = cv2.Canny(image, threshold1, threshold2[, edges[, apertureSize[, L2gradient ]]]) 

参数含义如下:

  • image:要检测的图像
  • threshold1:阈值1(最小值)
  • threshold2:阈值2(最大值),使用此参数进行明显的边缘检测
  • edges:图像边缘信息
  • apertureSize:sobel算子(卷积核)大小
  • L2gradient :布尔值。
  • True:使用更精确的L2范数进行计算(即两个方向的导数的平方和再开方)
  • False:使用L1范数(直接将两个方向导数的绝对值相加)

其中较大的阈值2用于检测图像中明显的边缘,但一般情况下检测的效果不会那么完美,边缘检测出来是断断续续的。所以这时候用较小的第一个阈值用于将这些间断的边缘连接起来。

阈值对检测结果的影响

import cv2
import numpy as np
from matplotlib import pyplot as plt

img = cv2.imread('d:\\girl.png')
edges = cv2.Canny(img,100,200,apertureSize=3)
edges2 = cv2.Canny(img,100,200,apertureSize=5)
plt.subplot(131),plt.imshow(img,cmap = 'gray')
plt.title('Original Image'), plt.xticks([]), plt.yticks([])
plt.subplot(132),plt.imshow(edges,cmap = 'gray')
plt.title('Edge Image1'), plt.xticks([]), plt.yticks([])
plt.subplot(133),plt.imshow(edges2,cmap = 'gray')
plt.title('Edge Image2'), plt.xticks([]), plt.yticks([])
plt.show()

可以看到,在调整threshold1之后,检测出的边缘增多了。

sobel算子对检测结果的影响

sobel默认的算子大小是3,扩大算子,会获得更多的细节,但是也更能提取图像了。

import cv2
import numpy as np
from matplotlib import pyplot as plt

img = cv2.imread('d:\\girl.png')
edges = cv2.Canny(img,100,200,apertureSize=3)
edges2 = cv2.Canny(img,100,200,apertureSize=5)
plt.subplot(131),plt.imshow(img,cmap = 'gray')
plt.title('Original Image'), plt.xticks([]), plt.yticks([])
plt.subplot(132),plt.imshow(edges,cmap = 'gray')
plt.title('Edge Image1'), plt.xticks([]), plt.yticks([])
plt.subplot(133),plt.imshow(edges2,cmap = 'gray')
plt.title('Edge Image2'), plt.xticks([]), plt.yticks([])
plt.show()

范数对检测结果的影响

L2gradient=True时,检测出的边缘减少了。

import cv2
import numpy as np
from matplotlib import pyplot as plt

img = cv2.imread('d:\\girl.png')
edges = cv2.Canny(img,100,200,L2gradient=False)
edges2 = cv2.Canny(img,100,200,L2gradient=True)
plt.subplot(131),plt.imshow(img,cmap = 'gray')
plt.title('Original Image'), plt.xticks([]), plt.yticks([])
plt.subplot(132),plt.imshow(edges,cmap = 'gray')
plt.title('Edge Image1'), plt.xticks([]), plt.yticks([])
plt.subplot(133),plt.imshow(edges2,cmap = 'gray')
plt.title('Edge Image2'), plt.xticks([]), plt.yticks([])
plt.show()

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • Python OpenCV Canny边缘检测算法的原理实现详解

    目录 Gaussian smoothing Computing the gradient magnitude and orientation Non-maxima suppression Hysteresis thresholding OpenCV实现 Gaussian smoothing 总的来说,Canny边缘检测可以分为四个步骤: 由于边缘检测对噪声敏感,因此对图像应用高斯平滑以帮助减少噪声.具体做法是,采用一个5*5的高斯平滑滤波器对图像进行滤波处理. Computing the gra

  • python中opencv Canny边缘检测

    目录 Canny边缘检测 Canny边缘检测基础 高斯滤波去除图像噪声 计算梯度 非极大值抑制 应用双阈值确定边缘 Canny函数及使用 Canny边缘检测 Canny边缘检测是一种使用多级边缘检测算法检测边缘的方法. OpenCV提供了函数cv2.Canny()实现Canny边缘检测. Canny边缘检测基础 Canny边缘检测分为如下几个步骤: 去噪.噪声会影响边缘检测的准确性,因此首先要将噪声过滤掉. 计算梯度的幅度与方向 非极大值抑制,即适当地让边缘“变瘦” 确定边缘.使用双阈值算法确定

  • Python实现Opencv cv2.Canny()边缘检测

    目录 1. 效果图 2. 源码 补充:OpenCV-Python 中 Canny() 参数 这篇博客将介绍Canny边缘检测的概念,并利用cv2.Canny()实现边缘检测: Canny边缘检测是一种流行的边缘检测算法.它是由约翰F开发的,是一个多阶段的算法: Canny边缘检测大致包含4个步骤: 降噪(使用高斯滤波去除高频噪声): 计算边缘梯度和方向(SobelX.SobleY核在水平方向和垂直方向对平滑后的图像进行滤波,找到每个像素的边缘梯度和方向): 非最大抑制(在得到梯度大小和方向后,对

  • Python如何使用cv2.canny进行图像边缘检测

    目录 使用cv2.canny进行图像边缘检测 阈值对检测结果的影响 sobel算子对检测结果的影响 范数对检测结果的影响 总结 使用cv2.canny进行图像边缘检测 CV2提供了提取图像边缘的函数canny. 其算法思想如下: 1.使用高斯模糊,去除噪音点(cv2.GaussianBlur) 2.灰度转换(cv2.cvtColor) 3.使用sobel算子,计算出每个点的梯度大小和梯度方向 4.使用非极大值抑制(只有最大的保留),消除边缘检测带来的杂散效应 5.应用双阈值,来确定真实和潜在的边

  • Python利用OpenCV和skimage实现图像边缘检测

    目录 一.简介 二.opencv 实践 三.skimage 实践 一.简介 提取图片的边缘信息是底层数字图像处理的基本任务之一.边缘信息对进一步提取高层语义信息有很大的影响.大部分边缘检测算法都是上个世纪的了,OpenCV 的使用的算法是 Canny 边缘检测算法,大概是在 1986 年由 John F. Canny 提出了,似乎说明边缘检测算法的研究已经到达了瓶颈期.跟人眼系统相比,边缘检测算法仍然逊色不少. Canny 边缘检测算法是比较出色的算法,也是一种多步算法,可用于检测任何输入图像的

  • python opencv实现图像边缘检测

    本文利用python opencv进行图像的边缘检测,一般要经过如下几个步骤: 1.去噪 如cv2.GaussianBlur()等函数: 2.计算图像梯度 图像梯度表达的是各个像素点之间,像素值大小的变化幅度大小,变化较大,则可以认为是出于边缘位置,最多可简化为如下形式: 3.非极大值抑制 在获得梯度的方向和大小之后,应该对整幅图像做一个扫描,去除那些非边界上的点.对每一个像素进行检查,看这个点的梯度是不是周围具有相同梯度方向的点中最大的.如下图所示: 4.滞后阈值 现在要确定那些边界才是真正的

  • Python 计算机视觉编程进阶之OpenCV 图像锐化及边缘检测

    目录 前言 (1)图像锐化 (2)图像边缘检测 a. 图像边缘 b. 边缘检测 1. 一阶微分算算子.二阶微分算子 2. 读取图像信息 3. Sobel 算子 4. Laplacian 算子 5. Scharr 算子 6. Canny 算子 7. 总结 8. 参考论文 参考的一些文章以及论文我都会给大家分享出来 -- 链接就贴在原文,论文我上传到资源中去,大家可以免费下载学习,如果当天资源区找不到论文,那就等等,可能正在审核,审核完后就可以下载了.大家一起学习,一起进步!加油!! 前言 (1)图

  • Python+OpenCV 图像边缘检测四种实现方法

    目录 1.Sobel算子 2.Schaar算子(更能体现细节) 3.Laplacian算子(基于零穿越的,二阶导数的0值点) 4.Canny边缘检测(被认为是最优的边缘检测算法) 总结 import cv2 as cv import numpy as np import matplotlib.pyplot as plt # 设置兼容中文 plt.rcParams['font.family'] = ['sans-serif'] plt.rcParams['font.sans-serif'] = [

  • 详解Python中图像边缘检测算法的实现

    目录 写在前面 1.一阶微分算子 1.1 Prewitt算子 1.2 Sobel算子 2.二阶微分算子 2.1 Laplace算子 2.2 LoG算子 3.Canny边缘检测 写在前面 从本节开始,计算机视觉教程进入第三章节——图像特征提取.在本章,你会见到一张简简单单的图片中蕴含着这么多你没注意到的细节特征,而这些特征将会在今后更高级的应用中发挥着极其重要的作用.本文讲解基础特征之一——图像边缘. 本文采用面向对象设计,定义了一个边缘检测类EdgeDetect,使图像边缘检测算法的应用更简洁,

  • python进行图像边缘检测的详细教程

    目录 边缘检测 边缘检测算子 1.Roberts算子 2.Prewitt算子 3.Sobel算子 4.Canny算子 5.拉普拉斯算子 效果实验 1. Roberts边缘检测 2.Prewitt 边缘检测 3.Sobel边缘检测 4.Canny边缘检测 5.Laplacian 边缘检测 总结 边缘检测 图像边缘是指图像中表达物体的周围像素灰度发生阶跃变化的那些像素集合. 图像中两个灰度不同的相邻区域的交界处,必然存在灰度的快速过渡或称为跳变,它们与图像中各区域边缘的位置相对应,边缘蕴含了丰富的内

  • python实现图像边缘检测

    本文实例为大家分享了python实现图像边缘检测的具体代码,供大家参考,具体内容如下 任务描述 背景 边缘检测是数字图像处理领域的一个常用技术,被广泛应用于图像特征提取.目标识别.计算机视觉等领域.边缘可以理解为像素值发生跃迁的地方,而边缘检测就是要找到这样的地方.如下图所示,对左图进行边缘检测,结果为右图. 基于卷积运算可实现边缘检测,对图像 1(设分辨率为 w×h)进行边缘检测的方法如下: 1)将图像 1 转换成灰度图,仍称为图像 1:2)新建图像 2,图像 2 为灰度图,分辨率与图像 1

  • python和C++共享内存传输图像的示例

    原理 python没有办法直接和c++共享内存交互,需要间接调用c++打包好的库来实现 流程 C++共享内存打包成库 python调用C++库往共享内存存图像数据 C++测试代码从共享内存读取图像数据 实现 1.c++打包库 创建文件 example.cpp #include <iostream> #include <cassert> #include <stdlib.h> #include <sys/shm.h> #include "opencv

随机推荐