#Canny边缘检测

canny边缘检测是一种非常流行的边缘检测算法,是John.F.Canny再1986年提出来了的。他是一个很多步构成的算法,我们接下来逐步介绍。

1、噪声去除 由于边缘检测很容易受到噪声的影响,所以第一步是使用5x5的高斯滤波器去除噪声

2、计算图像梯度 对平滑后的图像使用Sobel算子计算水平方向的和竖直方向的一阶导数(图像梯度)(Gx和Gy)。根据得到的这俩福梯度图(Gx和Gy)找到边界的梯度和方向, 公式如下:

梯度的方向一般总是与边界垂直。梯度方向被归为四类:垂直,水平,和俩个对角线。

3、非极大值抑制 再获得梯度的方向和大笑之后,应该对整幅图像做一个扫描,去除那些非边界上的点。对每一个像素进行检查,看这个点的梯度是不是周围具有相同的梯度方向的点 中最大的。如下所示: 上图当中的数字代表了像素点的梯度强度,箭头方向代表了梯度的方向。以第二排第三个像素点为例,由于梯度方向向上,则将这一点的强度(7)与其上下俩个像素点的强度 (5和4)比较,由于这一点强度最大,则保留。

4、滞后阈值 现在要确定那些边界才是真正的边界。这时我们需要设置俩个阈值:minVal和maxVal。当图像的灰度梯度高于maxVal时被认为是真的边界,那些低于minVal的边界会被抛弃 。如果介于俩者之间的话,就要看这个点是否与某个被确认为真正的边界点相连,如果是就认为它是边界点,如果不是就抛弃。如下图: A高于阈值maxVal所以是真正的边界点,B虽然低于maxVal但高于minVal并且与A相连,所以也被认为是真正的边界点。而C就会被抛弃,因为他不仅低于maxVal而 且不与真正的边界相连。D也会被抛弃,因为低于minVal。所以选择合适的maxVal和minVal对于能否得到好的结果非常重要。在这一步一些小的噪声点也会被除去,因为我们假设边界都是一些 长的线段。

Canny使用 再Opencv中只需要一个激活函数:cv2.Canny(),就可以完成以上几步。让我们看如何使用这个函数。这个函数的第一参数是输入图像。第二和第三个分别是 minVal和maxVal。第四个参数设置用来计算图像梯度的Sobel卷积核的大小,默认值为3.最后一个参数是L2gradient,它可以用来设定求梯度大小方程式。 如果设为True,就会使用我们饿上面提到过的方程:否则使用方程:,默认值是False。

import numpy as np
import matplotlib.pyplot as plt
import cv2
#图像边缘检测
def show(image):plt.imshow(image)plt.axis('off')plt.show()def imread(image):image=cv2.imread(image)#把图像的BGR转换成RGBimage=cv2.cvtColor(image,cv2.COLOR_BGR2RGB)return image
image=imread('im.jpg')
# show(image)
# image=cv2.cvtColor(image,cv2.COLOR_RGB2GRAY)def edge_detection(image,minVal=100,maxVal=200):image=cv2.cvtColor(image,cv2.COLOR_RGB2GRAY)edges=cv2.Canny(image,minVal,maxVal)plt.imshow(edges,'gray')plt.axis('off')plt.show()edge_detection(image)

效果展示:

注意设定边界的阈值的最大值和最小值,对结果影响还是特别大

import numpy as np
import matplotlib.pyplot as plt
import cv2
#图像边缘检测
def show(image):plt.imshow(image)plt.axis('off')plt.show()def imread(image):image=cv2.imread(image)#把图像的BGR转换成RGBimage=cv2.cvtColor(image,cv2.COLOR_BGR2RGB)return image
image=imread('im.jpg')
# show(image)
image=cv2.cvtColor(image,cv2.COLOR_RGB2GRAY)image = cv2.GaussianBlur(image,(3,3),0)
Value=[(10,150),(100,200),(180,230)]
plt.figure(figsize=(20,5))
for i,(minVal,maxVal) in enumerate(Value):plt.subplot(1,3,i+1)edges=cv2.Canny(image,minVal,maxVal)edges=cv2.GaussianBlur(edges,(3,3),0)plt.imshow(edges,'gray')plt.title(str((minVal,maxVal)))plt.axis('off')
plt.show()

效果展示:

不知道如何选取阈值:

import numpy as np
import matplotlib.pyplot as plt
import cv2
#图像边缘检测
def show(image):plt.imshow(image)plt.axis('off')plt.show()def imread(image):image=cv2.imread(image)#把图像的BGR转换成RGBimage=cv2.cvtColor(image,cv2.COLOR_BGR2RGB)return image
image=imread('im.jpg')
# show(image)
image=cv2.cvtColor(image,cv2.COLOR_RGB2GRAY)#不知道阈值应该如何选取
def auto_canny(image,sigma=0.33):v=np.median(image)lower=int(max(0,(1.0-sigma)*v))upper=int(min(255,(1.0+sigma)*v))edged=cv2.Canny(image,lower,upper)print(lower,upper)return edgededges=auto_canny(image)
edges=cv2.GaussianBlur(edges,(3,3),0)
plt.imshow(edges,'gray')
plt.axis('off')
plt.show()

效果展示:

OpenCv之Canny边界检测(笔记13)相关推荐

  1. opencv进阶学习笔记13:图像形态学操作大全(膨胀,腐蚀,开闭,黑帽,顶帽,梯度)python版

    基础版学习笔记: python3+opencv学习笔记汇总目录(适合基础入门学习) 进阶版笔记目录链接: python+opencv进阶版学习笔记目录(适合有一定基础) 基础版形态学: opencv学 ...

  2. [深度学习]Part1 Python学习进阶Ch24图像处理OpenCV(24.1~24.13)——【DeepBlue学习笔记】

    本文仅供学习使用 Python高级--Ch24图像处理OpenCV(24.1~24.13) 24. 图像处理OpenCV 24.1 图像读取.显示.保存 24.1.1 图像的基本操作 24.1.2 摄 ...

  3. opencv+Recorder︱OpenCV 中的 Canny 边界检测+轮廓、拉普拉斯变换

    本文来自于段力辉 译<OpenCV-Python 中文教程> 边缘检测是图像处理和计算机视觉中的基本问题,通过标识数字图像中亮度变化明显的点,来捕捉图像属性中的显著变化,包括深度上的不连续 ...

  4. OpenCV之Python学习笔记

    RSS订阅 登陆 注册 原文链接地址:http://www.itozi.net/19477.html OpenCV之Python学习笔记 ITOZI 发布于 2015-08-06 分类:OpenSta ...

  5. OpenCV之Python学习笔记(1)(2): 图像的载入、显示和保存 图像元素的访问、通道分离与合并

    OpenCV之Python学习笔记 一直都在用Python+OpenCV做一些算法的原型.本来想留下发布一些文章的,可是整理一下就有点无奈了,都是写零散不成系统的小片段.现在看到一本国外的新书< ...

  6. 36篇博文带你学完opencv :python+opencv进阶版学习笔记目录

    基础版学习笔记传送门 36篇博文带你学完opencv :python3+opencv学习笔记汇总目录(基础版) 进阶版笔记 项目 opencv进阶学习笔记1: 调用摄像头用法大全(打开摄像头,打开摄像 ...

  7. 12月19日 OpenCV 实战基础学习笔记——特征匹配

    文章目录 前言 一.特征匹配 1.Brute-force 蛮力匹配 2.1 对 1 匹配 3.k 对最佳匹配 二.答题卡识别 前言 本文为12月19日 OpenCV 实战基础学习笔记--特征匹配,分为 ...

  8. Python,Opencv cv2.Canny()边缘检测

    Python,Opencv的Canny边缘检测 1. 效果图 2. 源码 参考 这篇博客将介绍Canny边缘检测的概念,并利用cv2.Canny()实现边缘检测: Canny边缘检测是一种流行的边缘检 ...

  9. OpenCV for Ios 学习笔记(4)-标记检测1

    本文原始地址:OpenCV for Ios 学习笔记(4)-标记检测1 简单的标记经常是以白色块和黑色块构成的规则图形.因为我们预先知道这些因素,所以我们可以很容易检测标记. 如图: 首先,我们需要找 ...

最新文章

  1. 分布式存储(ceph)技能图谱(持续更新)
  2. 盘点2013年那些最优秀的网页设计作品【系列五】
  3. Uninstall Office 2016 for Mac
  4. java中多态_Java中多态的理解
  5. java 金字塔样式输出_Java打印金字塔(正实心、正空心,倒实心、倒空心),菱形...
  6. OpenShift 4 之集群是如何通过Cluster Version Operator升级的?
  7. 不会框架不要紧,我带你自定义框架
  8. C语言复习---获取矩阵的对角和
  9. 《暮色4:破晓(上)》暮光之城 高清蓝光BD 1080P 720P下载,附中英双字字幕!...
  10. java自动发图文微博_自动发带图的微博
  11. Jenkins构建maven项目失败
  12. 一篇运维老司机的大数据平台监控宝典(1)-联通大数据集群平台监控体系进程详解
  13. 深度相机原理揭秘之3D结构光Sensor(iPhone X、小米8探索版、OPPO Find)
  14. C语言十个数中求出平均值
  15. Navicat连接mysql时提示error:1130 hostxxx is not allowed to connect to this SQL server
  16. 后端-数据字典模块开发
  17. DNS劫持原理与操作
  18. CSS渐变字体、镂空字体、input框提示信息颜色、给图片加上内阴影、3/4圆
  19. C语言中的内部函数与外部函数
  20. Clair:CoreOS发布的开源容器漏洞分析工具

热门文章

  1. [jQuery] 通过ajax保存到服务器,成功显示信息.
  2. LA 4254 贪心
  3. 存储类、链接、内存管理
  4. 《DSP using MATLAB》示例Example4.6
  5. dynamic 找不到编译动态表达式所需的一种或多种类型。是否缺少引用?
  6. JavaScript中DOM的层次节点(一)
  7. Teamcity+SVN+VisualStudio在持续集成简明教程
  8. css 相对单位rem详解
  9. Struts2是什么?
  10. broadcast receiver 接收设备重启意图( boot_completed Broadcast Intent)而重启定时器