• 梯度简单来说就是求导,在图像上表现出来的就是提取图像的边缘(无论是横向的、纵向的、斜方向的等等),所须要的无非也是一个核模板。模板的不同结果也不同。所以能够看到,全部的这些个算子函数,归结究竟都能够用函数cv2.filter2D()来表示,不同的方法给予不同的核模板,然后演化为不同的算子而已。而且这仅仅是这类滤波函数的一个用途,以前写过一个关于matlab下滤波函数imfilter()的扩展应用(等同于opencv的cv2.filter2D函数):

    图像滤波函数imfilter函数的应用及其扩展

    就是非常多复杂的计算都是能够通过这个滤波函数组合实现,这种话速度快。

(一)关于Sobel算子与Scharr算子

Sobel算子是高斯平滑与微分操作的结合体。所以其抗噪能力非常强,用途较多。一般的sobel算子包含x与y两个方向,算子模板为:

sobelx=⎡⎣⎢−1−2−1000121⎤⎦⎥

sobely=⎡⎣⎢−101−202−101⎤⎦⎥

在opencv函数中,还能够设置卷积核(ksize)的大小,假设ksize=-1,就演变为3*3的Scharr算子,模板无非变了个数字:

scharrx=⎡⎣⎢−3−10−30003103⎤⎦⎥

scharry=⎡⎣⎢−303−10010−303⎤⎦⎥

贴一个相关具体參考:

OpenCV-Python教程(6、Sobel算子)

(二)关于拉普拉斯(Laplacian)算子

拉普拉斯算子能够实现图像的二阶倒数的定义,至于二阶倒数有什么意义,能够看这位博主的具体介绍:

OpenCV-Python教程(7、Laplacian算子)

其核模板为:

kernel=⎡⎣⎢0101−41010⎤⎦⎥

以下是对上述三种模板的实例:

import cv2
import numpy as np
import matplotlib.pyplot as plt img = cv2.imread('flower.jpg',0)
sobelx = cv2.Sobel(img,cv2.CV_64F,1,0,ksize=3)#默认ksize=3
sobely = cv2.Sobel(img,cv2.CV_64F,0,1)
sobelxy = cv2.Sobel(img,cv2.CV_64F,1,1)
laplacian = cv2.Laplacian(img,cv2.CV_64F)#默认ksize=3
#人工生成一个高斯核,去和函数生成的比較
kernel = np.array([[0,-1,0],[-1,4,-1],[0,-1,0]],np.float32)#
img1 = np.float64(img)#转化为浮点型的
img_filter = cv2.filter2D(img1,-1,kernel)
sobelxy1 = cv2.Sobel(img1,-1,1,1) plt.subplot(221),plt.imshow(sobelx,'gray')
plt.subplot(222),plt.imshow(sobely,'gray')
plt.subplot(223),plt.imshow(sobelxy,'gray')
plt.subplot(224),plt.imshow(laplacian,'gray') plt.figure()
plt.imshow(img_filter,'gray')





上述一个非常重要的问题须要明确的就是。在滤波函数第二个參数,当我们使用-1表示输出图像与输入图像的数据类型一致时,假设原始图像是uint8型的,那么在经过算子计算以后,得到的图像可能会有负值,假设与原图像数据类型一致,那么负值就会被截断变成0或者255,使得结果错误,那么针对这种问题有两种方式改变(上述程序中都有):一种就是改变输出图像的数据类型(第二个參数cv2.CV_64F)。还有一种就是改变原始图像的数据类型(此时第二个參数能够为-1,与原始图像一致)。

上述程序从结果上也说明使用函数cv2.filter2D也能达到同样的效果。

(三)Canny边缘检測算子

关于canny边缘检測算子,细究的话还算比較的复杂,给出一个介绍比較具体的博客吧:

canny算子

那么opencv中的函数也非常easy,直接cv2.Canny(),这个函数须要五个參数,原始图像,两个范围控制值minVal和maxVal(见上述原理介绍),第四个參数用于规定核模板的大小(默认3)。最后一个是true与false(默认)的选择。有一点不同,不太重要。能够试着那个好用那个。

import cv2
import matplotlib.pyplot as plt img = cv2.imread('flower.jpg',0)
edges = cv2.Canny(img,100,200)#其它的默认
plt.subplot(121),plt.imshow(img,'gray')
plt.subplot(122),plt.imshow(edges,'gray')

Python下opencv使用笔记(七)(图像梯度与边缘检測)的更多相关文章

  1. Python下opencv使用笔记(图像频域滤波与傅里叶变换)

    Python下opencv使用笔记(图像频域滤波与傅里叶变换) 转载一只程序喵 最后发布于2018-04-06 19:07:26 阅读数 1654  收藏 展开 本文转载自  https://blog ...

  2. Python下opencv使用笔记(一)(图像简单读取、显示与储存)

    写在之前 从去年開始关注python这个软件,途中间间断断看与学过一些关于python的东西.感觉python确实是一个简单优美.easy上手的脚本编程语言,众多的第三方库使得python异常的强大. ...

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

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

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

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

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

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

  6. Python下opencv使用笔记(十)(图像频域滤波与傅里叶变换)

    前面以前介绍过空间域滤波,空间域滤波就是用各种模板直接与图像进行卷积运算,实现对图像的处理,这个方案直接对图像空间操作,操作简单.所以也是空间域滤波. 频域滤波说究竟终于可能是和空间域滤波实现相同的功 ...

  7. Python下opencv使用笔记(图像的平滑与滤波)

    对于图形的平滑与滤波,但从滤波角度来讲,一般主要的目的都是为了实现对图像噪声的消除,增强图像的效果. 对于2D图像可以进行低通或者高通滤波操作 低通滤波(LPF):有利于去噪,模糊图像 高通滤波(HP ...

  8. Python下opencv使用笔记(二)(简单几何图像绘制)

    简单几何图像一般包含点.直线.矩阵.圆.椭圆.多边形等等.首先认识一下opencv对像素点的定义. 图像的一个像素点有1或者3个值.对灰度图像有一个灰度值,对彩色图像有3个值组成一个像素值.他们表现出 ...

  9. Python下opencv使用笔记(十一)(详解hough变换检测直线与圆)

    http://blog.csdn.net/on2way/article/details/47028969 http://blog.csdn.net/mokeding/article/details/1 ...

随机推荐

  1. Java集合数据类型

    Java集合如Map.Set.List等所有集合只能存放引用类型数据,它们都是存放引用类型数据的容器,不能存放如int.long.float.double等基础类型的数据. 1. 集合存储对象 Jav ...

  2. oracle整体结构-内存结构、物理结构、逻辑结构、进程

    Oracle的体系结构大体上分为两部分:Instance(实例)和Database(数据库). Instance(实例) :在Oracle Instance中主要包含了SGA以及一些进程(例如:PMO ...

  3. tomcat6-endpoint设计

    之前写的一个ppt 搬到博客来

  4. xml报错“cvc-complex-type.2.4.c: The matching wildcard is strict, but no declaration can be found for element”

    配置使用dubbo时,xml报错“cvc-complex-type.2.4.c: The matching wildcard is strict, but no declaration can be ...

  5. Text Region Mask

    本系列文章由 @yhl_leo 出品,转载请注明出处. 文章链接: http://blog.csdn.net/yhl_leo/article/details/52886351 Python code ...

  6. 【bzoj2085】[Poi2010]Hamsters Hash+倍增Floyd

    题目描述 Tz养了一群仓鼠,他们都有英文小写的名字,现在Tz想用一个字母序列来表示他们的名字,只要他们的名字是字母序列中的一个子串就算,出现多次可以重复计算.现在Tz想好了要出现多少个名字,请你求出最 ...

  7. 模拟tap事件和longTap事件

    移动端模拟tap和longTap事件,基本原理就是在touchstart和touchend事件中,计算触摸的位移和时间差,位移在一定范围内(轻微滑动),时间小于150ms为tap事件,时间大于300m ...

  8. How to resolve mysql problem when you get code 2003(10061) and 1130

    When I use Navicate to connect to mysql on Ubuntu, I got message 2003(10061) firstly. To resovle thi ...

  9. 第一次用写一个3d轮播

    2016-07-11gallery  3d html <!doctype html><html lang="en"><head> <met ...

  10. JS对象直接量,数组直接量和函数直接量

    对象直接量创建一个对象: var obj = {x:[1,2],y:23}; 代码跟下面是一样的. var obj=new Object(); obj.x=new Array(1,2); obj.y= ...