Opencv笔记(十三)——图像的梯度
目标
- 认识图像梯度、边界
- 学习函数cv2.Sobel(),cv2.Schar(),cv2.Laplacian()
原理
图像梯度可以把图像看成二维离散函数,图像梯度其实就是这个二维离散函数的求导。OpenCV提供三种类型的梯度滤波器或高通滤波器,Sobel,Scharr和Laplacian.
Sobel 和 Scharr 算子
Sobel算子是结合了高斯平滑与微分运算的结合方法,所以它的抗噪声能力很强,其是普通一阶差分,是基于寻找梯度强度。每一个算子分别对应这x和y这两个方向的模板,故在代码中要分别在两个方向上处理,最后用cv2.addWeighted(...)函数将其组合起来。
Sobel算子
Sobel函数原型如下:
cv2.Sobel(src, ddepth, dx, dy[, dst[, ksize[, scale[, delta[, borderType]]]]])
前四个是必须的参数:
- 第一个参数是需要处理的图像;
- 第二个参数是图像的深度(数据类型),-1表示采用的是与原图像相同的深度。目标图像的深度必须大于等于原图像的深度;
- dx和dy表示的是求导的阶数,0表示这个方向上没有求导,一般为0、1、2;
其后是可选的参数:
- ksize是Sobel算子的大小,必须为1、3、5、7。如果ksize=-1,那么一个3*3的scharr滤波器会被使用;
- delta是一个可选的增量,将会加到最终的dst中,同样,默认情况下没有额外的值加到dst中;
- borderType是判断图像边界的模式。这个参数默认值为cv2.BORDER_DEFAULT;
Laplacian算子
拉普拉斯算子是常用的边缘检测算子,它是各向同性的二阶导数。
计算公式
卷积核
代码实践
Sobel算子:
# coding=utf-8
import cv2
import numpy as np
img = cv2.imread("/home/wl/1.jpg", 0)
x = cv2.Sobel(img, cv2.CV_16S, 1, 0)
y = cv2.Sobel(img, cv2.CV_16S, 0, 1)
absX = cv2.convertScaleAbs(x) # 转回uint8
absY = cv2.convertScaleAbs(y)
dst = cv2.addWeighted(absX, 0.5, absY, 0.5, 0)
while(1):
cv2.imshow("absX", absX)
cv2.imshow("absY", absY)
cv2.imshow("Result", dst)
k = cv2.waitKey(1) & 0XFF
if k==ord('q'):
break;
cv2.destroyAllWindows()
原图:
效果图:
Laplacian算子:
# coding=utf-8
import cv2
import numpy as np
img = cv2.imread("/home/wl/1.jpg", 0)
laplacian=cv2.Laplacian(img,cv2.CV_64F)
dst = cv2.convertScaleAbs(laplacian) #转回uint8
while(1):
cv2.imshow("Result",dst)
k = cv2.waitKey(1) & 0XFF
if k==ord('q'):
break;
cv2.destroyAllWindows()
效果图:
注意点
代码看了的话,会发现我们的sobel函数的第二个参数(数据类型)会换成cv2.CV_16S或cv2.CV_64F,最后再变回uint8。这是因为从黑到白的边界点的导数是正数,而从白到黑是负数,如果还是使用uint8,那么所有的负数都会变为0,即被截断。
Opencv笔记(十三)——图像的梯度的更多相关文章
- opencv-学习笔记(6)图像梯度Sobel以及canny边缘检测
opencv-学习笔记(6)图像梯度Sobel以及canny边缘检测 这章讲了 sobel算子 scharr算子 Laplacion拉普拉斯算子 图像深度问题 Canny检测 图像梯度 sobel算子 ...
- opencv笔记2:图像ROI
time:2015年 10月 03日 星期六 12:03:45 CST # opencv笔记2:图像ROI ROI ROI意思是Region Of Interests,感兴趣区域,是一个图中的一个子区 ...
- Python下opencv使用笔记(图像频域滤波与傅里叶变换)
Python下opencv使用笔记(图像频域滤波与傅里叶变换) 转载一只程序喵 最后发布于2018-04-06 19:07:26 阅读数 1654 收藏 展开 本文转载自 https://blog ...
- opencv笔记6:角点检测
time:2015年10月09日 星期五 23时11分58秒 # opencv笔记6:角点检测 update:从角点检测,学习图像的特征,这是后续图像跟踪.图像匹配的基础. 角点检测是什么鬼?前面一篇 ...
- opencv笔记4:模板运算和常见滤波操作
time:2015年10月04日 星期日 00时00分27秒 # opencv笔记4:模板运算和常见滤波操作 这一篇主要是学习模板运算,了解各种模板运算的运算过程和分类,理论方面主要参考<图像工 ...
- OpenCV笔记大集锦(转载)
整理了我所了解的有关OpenCV的学习笔记.原理分析.使用例程等相关的博文.排序不分先后,随机整理的.如果有好的资源,也欢迎介绍和分享. 1:OpenCV学习笔记 作者:CSDN数量:55篇博文网址: ...
- opencv笔记5:频域和空域的一点理解
time:2015年10月06日 星期二 12时14分51秒 # opencv笔记5:频域和空域的一点理解 空间域和频率域 傅立叶变换是f(t)乘以正弦项的展开,正弦项的频率由u(其实是miu)的值决 ...
- opencv笔记3:trackbar简单使用
time:2015年 10月 03日 星期六 13:54:17 CST # opencv笔记3:trackbar简单使用 当需要测试某变量的一系列取值取值会产生什么结果时,适合用trackbar.看起 ...
- opencv笔记1:opencv的基本模块,以及环境搭建
opencv笔记1:opencv的基本模块,以及环境搭建 安装系统 使用fedora22-workstation-x86_64 安装opencv sudo dnf install opencv-dev ...
- python3.4学习笔记(十三) 网络爬虫实例代码,使用pyspider抓取多牛投资吧里面的文章信息,抓取政府网新闻内容
python3.4学习笔记(十三) 网络爬虫实例代码,使用pyspider抓取多牛投资吧里面的文章信息PySpider:一个国人编写的强大的网络爬虫系统并带有强大的WebUI,采用Python语言编写 ...
随机推荐
- 手把手教你用Python实现“坦克大战”,附详细代码!
小时候玩的“坦克大战”,你还记得吗? 满满的回忆 ! 今天,我们使用Python以及强大的第三方库来实现一个简单的坦克大战游戏. 整体效果 环境依赖 python3.7 pygame1.9.6 ...
- 算法(第4版)Robert Sedgewick 刷题 第一章(1)
/** * @Description 颠倒数组排列顺序 * @author SEELE * @date 2017年8月17日 上午10:56:17 * @action sortArr */ publi ...
- Codeforces 444C 线段树 懒惰标记
前天晚上的CF比赛div2的E题,很明显一个线段树,当时还在犹豫复杂度的问题,因为他是区间修改和区间查询,肯定是要用到懒惰标记. 然后昨天真的是给这道题跪了,写了好久好久,...我本来是写了个add标 ...
- python np array转json
np array转json import numpy as np import codecs, json a = np.arange().reshape(,) # a by array b = a.t ...
- 第四章:Schema与数据类型优化
1. 选择优化的数据类型 选择数据类型的原则 更小的通常更好:选择可以正确存储数据的最小数据类型 小的数据类型消耗更少的内存.CPU;占用更少的磁盘 选用简单的数据类型:简单的数据类型通常需要更少的C ...
- 一天一个设计模式——Builder建造者模式
一.模式说明 在现实世界中,当我们要构造一个大型工程时(建一个大楼),通常的做法是先建造工程的每个独立部分,然后再逐步构造完成(先打地基,再搭框架,最后逐层累造).在程序设计领域,构造一个复杂的类时( ...
- python yield 使用示例
1.yield由于创建迭代器 def deal(): tmp = [] for i in range(20): tmp.append(i) if i % 4 == 0: yield tmp tmp = ...
- unable to execute /bin/mv: Argument list too long
四种解决”Argument list too long”参数列表过长的办法 转自 http://hi.baidu.com/cpuramdisk/item/5aa49ce00c0757aecf2d4f2 ...
- Jmeter接口测试之案例实战
Jmeter是apacheg公司基于Java开发的一款开源的压力测试工具,安装Jmeter之前先安装Jdk,具体JDK安装和环境变量配置自行百度.这里不概述. 1.添加线程组 测试计划->添加- ...
- CentOS系统安装过程中配置软RAID-0或RAID-1
什么是RAID-0 RAID-0 (等量模式, stripe):效能最佳.这种模式如果使用相同型号与容量的磁碟来组成时,效果较佳.这种模式的 RAID 会将磁碟先切出等量的区块 (举例来说, 4KB) ...