opencv-学习笔记(6)图像梯度Sobel以及canny边缘检测


这章讲了

  1. sobel算子
  2. scharr算子
  3. Laplacion拉普拉斯算子
  4. 图像深度问题
  5. Canny检测

图像梯度

  1. sobel算子和scharr算子

sobel算子是高斯平滑与微分操作的结合体,所以它的抗噪声能力很强

我们可以设定求导的方向xorder或者yorder。也可以设置卷积核的大学

Ps当我们设置卷积核的大小为ksize=-1时候,这个函数会用

3*3的scharr算子如下

官方推荐在使用3*3滤波器时候要用scharr滤波器


Laplacion算子

拉普拉斯算子可以使用二阶导数的形式定义,可假设其离散实现类型于二阶Sobel导数实际上,

Opencv在计算拉普拉斯算子时直接调用Sobel算子。

计算公式如下

拉普拉斯滤波器使用的卷积核

Opencv在计算拉普拉斯算子时候是直接调用sobel算子的

  1. import cv2
  2. import numpy as np
  3. from matplotlib import pyplot as plt
  4.  
  5. img=cv2.imread('1.jpg',0)
  6.  
  7. #cv2.CV_64F 输出图像的深度(数据类型),可以使用-1与源图像保持一致 np.uint8
  8. laplacian=cv2.Laplacian(img,cv2.CV_64F)
  9. #参数1,0为只在x方向求一阶导数,最大可以求2阶导数,卷积核5*5
  10. #对x滤波就显示y波形
  11. sobelx=cv2.Sobel(img,cv2.CV_64F,1,0,ksize=5)
  12. #参数0,1为只在y方向求一阶导数,最大可以求2阶导数,卷积核5*5
  13. #对y滤波就显示x波形
  14. sobely=cv2.Sobel(img,cv2.CV_64F,0,1,ksize=5)
  15.  
  16. cv2.imshow('one',img)
  17. cv2.imshow('lap',laplacian)
  18. cv2.imshow('sx',sobelx)
  19. cv2.imshow('sy',sobely)
  20. cv2.waitKey(0)


图像深度问题

看下面2个例子,

都是用5*5的卷积核,只是输出图像的深度不同,第四张是原图深度

水平的导数都消失了

从第三章可以看出来,导数小于0的地方没有消失,但是图24消失了导数小于0的地方


Canny边缘检测

  1. 首先我们要去除噪声5*5的高斯滤波器
  2. 我们计算图像的梯度计算图像x和y方向的一阶导数,根据两幅梯度体系找到边界的梯度大小和方向,(梯度一般总是和边界垂直,梯度方向被归为四类,垂直水平和对角线)
  3. 这是计算梯度大小和方向的函数
  4. 非极大值抑制,去除非边界的点,对每一个像素检查,看这个点梯度是不是周围具有相同梯度方向的点中最大的。
  5. 滞后阀值----设置两个阀值minVal和maxVal当图像的灰度梯度高于maxVal时候被认为是真的边界,低于minVal就被抛弃,如果在两者之间的话就看这个点时候和某个被确认为真正边界的点相连,如果是就认为他也是边界,,否则抛弃。
  6. 如下图
  7. 图中A高于maxVal被认为是真正的边界带你,C虽然低于maxVal但是高于minVAl且和A相连,所以C也是边界点。B被抛弃

    这一步中一些小的噪声点被去除,因为我们假设边界都是一些长的线段

在opencv里面我们用一个函数来完成上面所有步骤

cv2.Canny()

Cv2.canny(图像对象,minVal,maxVal,用来计算梯度的Sobel卷积核大小Size=3,L2gradient)

如果L2gradient是True就会用到上面的步骤

如果L2gradient是false就会edge_graddient=|Gx^2|+|Gy^2|来代替

代码如下,这里使用的是size=3的默认卷积核以及,L2gradient=True

  1. import cv2
  2. import numpy as np
  3. from matplotlib import pyplot as plt
  4.  
  5. img=cv2.imread('new.jpg',1)
  6. minval=100
  7. maxval=200
  8. edges=cv2.Canny(img,minval,maxval,False)
  9. edges2=cv2.Canny(img,minval,maxval,True)
  10. cv2.imshow('dsd',img)
  11. cv2.imshow('s',edges)
  12. cv2.imshow('s2',edges2)
  13. k=cv2.waitKey(0)
  14. cv2.destroyAllWindows()

opencv-学习笔记(6)图像梯度Sobel以及canny边缘检测的更多相关文章

  1. OpenCV学习笔记(10)——图像梯度

    学习图像梯度,图像边界等 梯度简单来说就是求导. OpenCV提供了三种不同的梯度滤波器,或者说高通滤波器:Sobel,Scharr和Lapacian.Sobel,Scharr其实就是求一阶或二阶导. ...

  2. opencv学习笔记(六)---图像梯度

    图像梯度的算法有很多方法:sabel算子,scharr算子,laplacian算子,sanny边缘检测(下个随笔)... 这些算子的原理可参考:https://blog.csdn.net/poem_q ...

  3. [OpenCV学习笔记3][图像的加载+修改+显示+保存]

    正式进入OpenCV学习了,前面开始的都是一些环境搭建和准备工作,对一些数据结构的认识主要是Mat类的认识: [1.学习目标] 图像的加载:imread() 图像的修改:cvtColor() 图像的显 ...

  4. opencv学习笔记(五)----图像的形态学操作

    图像的形态学操作有基本的腐蚀和膨胀操作和其余扩展形态学变换操作(高级操作)-----开运算,闭运算,礼帽(顶帽)操作,黑帽操作...(主要也是为了去噪声,改善图像) 形态学操作都是用于处理二值图像(其 ...

  5. OpenCV学习笔记(7)——图像阈值

    简单阈值,自适应阈值,Otsu's二值化等 1.简单阈值 当像素值高于阈值时,我们给这个像素赋予一个新值,否则给他赋予另一个值.这个函数就是cv2.threshhold().这个函数的第一个参数就是原 ...

  6. opencv学习笔记(七)---图像金字塔

    图像金字塔指的是同一图像不同分辨率的子图的集合,有向下取样金字塔,向上取样金字塔,拉普拉斯金字塔....它是图像多尺度表达的一种,最主要的是用于图像的分割 向下取样金字塔指高分辨率图像向低分辨率图像的 ...

  7. opencv学习笔记3——图像缩放,翻转和阈值分割

    #图像的缩放操作 #cv.resize(src,dsize,dst=None,,fx=None,fy=None,interpolation=None) #src->原图像,dsize->目 ...

  8. OpenCV学习笔记(3)——图像的基本操作

    获取图像的像素值并修改 获取图像的属性(信息) 图像的ROI() 图像通道的拆分及合并 1.获取并修改像素值 先读入图像装入一个图像实体,然后该实体相当于一个多维list,可以直接用数组操作提取像素信 ...

  9. OpenCV 学习笔记 02 使用opencv处理图像

    1 不同色彩空间的转换 opencv 中有数百种关于不同色彩空间的转换方法,但常用的有三种色彩空间:灰度.BRG.HSV(Hue-Saturation-Value) 灰度 - 灰度色彩空间是通过去除彩 ...

随机推荐

  1. Unity 游戏框架搭建 2018 (二) 单例的模板与最佳实践

    Unity 游戏框架搭建 2018 (二) 单例的模板与最佳实践 背景 很多开发者或者有经验的老手都会建议尽量不要用单例模式,这是有原因的. 单例模式是设计模式中最简单的也是大家通常最先接触的一种设计 ...

  2. 理解AndroidX

    理解AndroidX 刚刚看到自己加的一个Android群里有人问AndroidX,还是Google自己的,竟然没听说过,慌的一匹.赶紧去看了下官方文档和一些博客,对AndroidX有了如下理解 An ...

  3. ABAP术语-Transaction

    Transaction 原文:http://www.cnblogs.com/qiangsheng/archive/2008/03/19/1112804.html Logical process in ...

  4. .Net core 使用Swagger

    接触到项目的时候,用了很久的Swagger,发现Swagger真的非常好用,不但方便了调试Web Api,还生成了Api 文档,真是非常的好用啊. 然后我想搞懂到底如何使用Swagger,所以自己建了 ...

  5. python2.7+PyQt4+eric6 界面开发环境配置

    1.安装环境: python2.7 PyQt4-4.11.4-gpl-Py2.7-Qt4.8.7-x64.exe eric6-18.12.zip 2.安装步骤: 1.安装python2.7的过程略 2 ...

  6. PHP中call user func()和call_user_func_array()调用自定义函数小结

    call_user_func() 和 call_user_func_array(),通过传入字符串函数,可以调用自定义函数,并且支持引用,都允许用户调用自定义函数并传入一定的参数: 1.mixed c ...

  7. JavaScript 时间对象 date()

    getYear() 获得的是距离1900年过了多少年 var d = new Date(); document.write(d+"<br />"); document. ...

  8. mint-ui message box 问题;

    当引用 mint-ui message box 的 出现的问题,我暂时是不知道为什么: 官网是这样写的: 于是 我也这么做的:(这里用小写,具体我也不清楚,毕竟文档上写的也不是很清楚,但是只有这样写, ...

  9. TinyMCE插件:Filemanager [4.x-6.x] 文件名统一格式化

    上传图片程序(filemanager/upload.php) 在if (!empty($_FILES) && $upload_files)中上传图片时,在文件正式上传至服务器前,有一次 ...

  10. 『Python基础-11』集合 (set)

    # 『Python基础-11』集合 (set) 目录: 集合的基本知识 集合的创建 访问集合里的值 向集合set增加元素 移除集合中的元素 集合set的运算 1. 集合的基本知识 集合(set)是一个 ...