原理:

梯度本质上就是导数。OpenCV 提供了三种不同的梯度滤波器,或者说高通滤波器:Sobel,Scharr 和Laplacian。Sobel,Scharr 其实就是求一阶或二阶导数。Scharr 是对Sobel(使用小的卷积核求解求解梯度角度时)的优化。Laplacian 是求二阶导数。

1. Sobel 算子和Scharr 算子

Sobel 算子是高斯平滑微分操作的结合体,所以它的抗噪声能力很好。你可以设定求导的方向(xorder 或yorder)。还可以设定使用的卷积核的大小(ksize)。如果ksize=-1,会使用3x3 的Scharr 滤波器,它的的效果要比3x3 的Sobel 滤波器好(而且速度相同,所以在使用3x3 滤波器时应该尽量使用Scharr 滤波器)。3x3 的Scharr 滤波器卷积核如下:

x方向

-3 0 3
-10 0 10
-3 0 3

y方向

-3 -10 -3
0 0
3 10  3

2. Laplacian 算子

拉普拉斯算子可以使用二阶导数的形式定义,可假设其离散实现类似于二阶Sobel 导数,事实上,OpenCV 在计算拉普拉斯算子时直接调用Sobel 算子。计算公式如下:

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

代码:

下面的代码分别使用以上三种滤波器对同一幅图进行操作。使用的卷积核都是5x5 的。

# -*- coding: utf-8 -*-
import cv2
import numpy as np
from matplotlib import pyplot as plt
img=cv2.imread('dave.jpg',0)
#cv2.CV_64F 输出图像的深度(数据类型),可以使用-1, 与原图像保持一致np.uint8
laplacian=cv2.Laplacian(img,cv2.CV_64F)
# 参数1,0 为只在x 方向求一阶导数,最大可以求2 阶导数。
sobelx=cv2.Sobel(img,cv2.CV_64F,1,0,ksize=5)
# 参数0,1 为只在y 方向求一阶导数,最大可以求2 阶导数。
sobely=cv2.Sobel(img,cv2.CV_64F,0,1,ksize=5)
plt.subplot(2,2,1),plt.imshow(img,cmap = 'gray')
plt.title('Original'), plt.xticks([]), plt.yticks([])
plt.subplot(2,2,2),plt.imshow(laplacian,cmap = 'gray')
plt.title('Laplacian'), plt.xticks([]), plt.yticks([])
plt.subplot(2,2,3),plt.imshow(sobelx,cmap = 'gray')
plt.title('Sobel X'), plt.xticks([]), plt.yticks([])
plt.subplot(2,2,4),plt.imshow(sobely,cmap = 'gray')
plt.title('Sobel Y'), plt.xticks([]), plt.yticks([])
plt.show()

结果:

附:

在上面这个例子的注释有提到:当我们可以通过参数-1 来设定输出图像的深度(数据类型)与原图像保持一致,但是我们在代码中使用的却是cv2.CV_64F。这是为什么呢?想象一下一个从黑到白的边界的导数是整数,而一个从白到黑的边界点导数却是负数。如果原图像的深度是np.int8 时,所有的负值都会被截断变成0,换句话说就是把把边界丢失掉。所以如果这两种边界你都想检测到,最好的的办法就是将输出的数据类型设置的更高,比如cv2.CV_16S,cv2.CV_64F 等。取绝对值然后再把它转回到cv2.CV_8U。下面的示例演示了输出图片的深度不同造成的不同效果。

代码:

# -*- coding: utf-8 -*-
import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('boxs.png',0)
# Output dtype = cv2.CV_8U
sobelx8u = cv2.Sobel(img,cv2.CV_8U,1,0,ksize=5)
# 也可以将参数设为-1
#sobelx8u = cv2.Sobel(img,-1,1,0,ksize=5)
# Output dtype = cv2.CV_64F. Then take its absolute and convert to cv2.CV_8U
sobelx64f = cv2.Sobel(img,cv2.CV_64F,1,0,ksize=5)
abs_sobel64f = np.absolute(sobelx64f)
sobel_8u = np.uint8(abs_sobel64f)
plt.subplot(1,3,1),plt.imshow(img,cmap = 'gray')
plt.title('Original'), plt.xticks([]), plt.yticks([])
plt.subplot(1,3,2),plt.imshow(sobelx8u,cmap = 'gray')
plt.title('Sobel CV_8U'), plt.xticks([]), plt.yticks([])
plt.subplot(1,3,3),plt.imshow(sobel_8u,cmap = 'gray')
plt.title('Sobel abs(CV_64F)'), plt.xticks([]), plt.yticks([])
plt.show()

结果:

OpenCV 图像梯度 :cv2.Sobel(),cv2.Schar(),cv2.Laplacian() + 数据类型设置:cv2.CV_8U,cv2.CV_16S,cv2.CV_64F相关推荐

  1. OpenCV图像梯度(Sobel和Scharr)

    OpenCV图像梯度(Sobel和Scharr) 1 图像梯度是什么? 2 图像梯度的用途 3 图像梯度的使用 参考 这篇博客将介绍图像渐变以及如何使用OpenCV的cv2.Sobel计算Sobel渐 ...

  2. opencv 图像梯度(python)

    图像梯度 图像梯度 Sobel理论基础 计算水平方向偏导数的近似值 计算垂直方向偏导数的近似值 Sobel算子及函数使用 注意点:参数ddepth 方向 计算x方向和y方向的边缘叠加 Scharr算子 ...

  3. OpenCV——图像梯度与边缘检测(python实现)

    OpenCV--图像梯度与边缘检测 6.1 简介 严格的说,梯度计算需要求导数.但是图像梯度的计算,是通过计算像素值的差得到梯度的近似值.图像梯度表示的是图像变化的速度,反映了图像的边缘信息. 边缘是 ...

  4. OpenCV 图像梯度 Sobel、Scharr、Laplacian

    概念: 梯度简单来说就是求导,在图像上表现出来的就是提取图像的边缘(不管是横向的.纵向的.斜方向的等等),所需要的无非也是一个核模板,模板的不同结果也不同.所以可以看到,所有的这些个算子函数,归结到底 ...

  5. 基于Python的Opencv图像梯度处理

    图像梯度直观反应其实就是图像当中各物体的轮廓,而在像素点上的体现其实就是相邻像素点之间的差值,差值越大,轮廓就会越清晰(可用于图像增强),而Opencv提供了以下三种算子来进行图像的梯度处理,跟在之前 ...

  6. 图像梯度算子——Sobel/scharr/Laplacian

    1.sobel算子 sobel算子可以计算图像梯度,计算图像梯度的作用是提取边界. (1)X方向的梯度 以3x3的卷积核计算sobel算子为例: 图中左边就是计算水平梯度时的卷积核,简单来说就是右边减 ...

  7. OpenCV图像梯度算子

            梯度简单来说就是求导.         OpenCV 提供了三种不同的梯度滤波器,或者说高通滤波器:Sobel,Scharr 和 Laplacian.         Sobel,Sc ...

  8. opencv-python图像处理 ----图像梯度、Sobel算子

    一.图像的梯度处理 1.Sobel算子 梯度可以按照x方向或者y方向求梯度,其实就是在看像素点的差异变化情况,比如黑白物体的交界,其像素值变化差异是非常大的. 求梯度计算使用的函数就叫做Sobel算子 ...

  9. Opencv之图像边缘检测:1.Sobel算子(cv2.Sobel)

    图像梯度计算的是图像变化的速度.对于图像的边缘部分,其灰度值变化较大,梯度值也较大:相反,对于图像中比较平滑的部分,其灰度值变化较小,相应的梯度值也较小.一般情况下,图像梯度计算的是图像的边缘信息. ...

最新文章

  1. html5标签 H5标签
  2. 欲瘦其包,必先探清其底细
  3. SQL Server 执行 字符串
  4. [摘自MSDN] ASP.Net2.0学习 [2] 主题 1 :ASP.NET 主题和外观概述
  5. 宁德时代预计一季度净利润超9.9亿元 同比增长超140%
  6. Flink之Watermark滑动窗口案例
  7. u盘解密软件_企业都使用哪些数据防泄密软件
  8. 计算机组成原理 第七章 输入输出系统
  9. 什么是死亡之 Ping 攻击?
  10. 电脑实用的软件及工具
  11. mysql数据导出insert_mysql 数据导出
  12. 数据库学生学籍管理系统
  13. 爬取今日头条街拍美女图片
  14. 手机充值业务python_小伙利用Python爆破某会员网站,充会员?不存在的!
  15. 两个龙的linux,Linux办公一条龙之组件间的调用
  16. PCIe ECAM机制访问PCIE的配置空间
  17. GWAS研究和多基因评分
  18. 高性能v100 gpu服务器,TESLA V100 GPU 加速性能指南
  19. 基于OpenCV的人脸识别考勤系统
  20. js 判断是域名还是ip并获取当前url中指定部分

热门文章

  1. 什么是云管平台?一个正在兴起的市场!
  2. 华为设备路由策略配置命令
  3. linux 音频文件格式,Linux音频驱动-WAV文件格式分析
  4. oracle数据库system01,system01坏块的问题
  5. RHEL 6.5----SCSI存储
  6. Direct3D 10系统(二)
  7. torch dataloader 数据并行_PyTorch Parallel Training(单机多卡并行、混合精度、同步BN训练指南文档)
  8. java实现.费诺编码_使用递归算法编写的费诺编码
  9. 黑客每小时发送3万封性勒索邮件:轻松月入11万!
  10. 李彦宏现身巴黎Viva科技大会:机遇常在,未来通过科技和创新改变生活