OpenCV学习笔记(10)——图像梯度
- 学习图像梯度,图像边界等
梯度简单来说就是求导。
OpenCV提供了三种不同的梯度滤波器,或者说高通滤波器:Sobel,Scharr和Lapacian。Sobel,Scharr其实就是求一阶或二阶导。Scharr是对Sobel的部分优化。Laplacian是求二阶导。
1.Sobel算子和Scharr算子
Sobel算子是高斯平滑和微分操作的结合体,所以他的抗噪声能力很好。你可以设定求导的方向(xorder 或 yorder)。还可以设定使用的卷积核大小(ksize)。当ksize=-1时,会使用3*3 的Scharr滤波器,他的效果要比3*3的Sobel滤波器好,而且速度相同,所以在使用3*3滤波器时应该尽量使用Scharr滤波器(一般就用Sobel算子即可)。3*3 的 Scharr滤波器卷积核如下所示:
2.Laplacian算子
拉普拉斯算子可以使用二阶导数的形式定义,可假设其离散实现类似于二阶Sobel导数。事实上,OpenCV在计算拉普拉斯算子时直接调用Sobel算子,具体计算公式如下:
拉普拉斯滤波器使用的卷积核:
下面的例程将展示三种滤波器对同一副图像进行操作产生的效果,其使用的卷积核大小都是5*5的
import numpy as np
import cv2
from matplotlib import pyplot as plt
img = cv2.imread('7.png',0)
laplacian = cv2.Laplacian(img,cv2.CV_64F)#注意这里的depth参数!
#cv2.CV_64F 输出图像的深度(数据类型),可以使用-1,与原图像保持一致
sobelx = cv2.Sobel(img, cv2.CV_64F,1,0,ksize=5)
#参数1,0表示在x方向求一阶导数,最大可以求2阶导数
sobely = cv2.Sobel(img,cv2.CV_64F,0,1,ksize=5)
#同理0,1表示在y方向求一阶导数,最大可以求二阶导数
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()
书上的例图更为明显的表现出区别:
这里解释为什么要用cv2.CV_64F,当使用-1(或者cv2.CV_8U)(与原图深度(数据类型)保持一致)时,输出的图像如下
laplacian sobelx
想象一下一个从黑到白的边界的导数し整数,而一个从白到黑的边界点的导数却是负数。如果原图像的深度是np.int8时,所有的负值都会截断成为0,换句话说就是把边界丢失掉了。因此如果想把两种边界都检测到,最好的办法就是将输出的数据类型设置到更高,如cv2.CV_16S,cv2.CV_64F等,取绝对值然后再把它转回到cv2.CV_8U(即把本来为负的部分转为正的,在转回uint8便可以显示)
OpenCV学习笔记(10)——图像梯度的更多相关文章
- opencv学习笔记(六)---图像梯度
图像梯度的算法有很多方法:sabel算子,scharr算子,laplacian算子,sanny边缘检测(下个随笔)... 这些算子的原理可参考:https://blog.csdn.net/poem_q ...
- [OpenCV学习笔记3][图像的加载+修改+显示+保存]
正式进入OpenCV学习了,前面开始的都是一些环境搭建和准备工作,对一些数据结构的认识主要是Mat类的认识: [1.学习目标] 图像的加载:imread() 图像的修改:cvtColor() 图像的显 ...
- opencv学习笔记(五)----图像的形态学操作
图像的形态学操作有基本的腐蚀和膨胀操作和其余扩展形态学变换操作(高级操作)-----开运算,闭运算,礼帽(顶帽)操作,黑帽操作...(主要也是为了去噪声,改善图像) 形态学操作都是用于处理二值图像(其 ...
- OpenCV学习笔记(7)——图像阈值
简单阈值,自适应阈值,Otsu's二值化等 1.简单阈值 当像素值高于阈值时,我们给这个像素赋予一个新值,否则给他赋予另一个值.这个函数就是cv2.threshhold().这个函数的第一个参数就是原 ...
- OpenCV学习笔记(3)——图像的基本操作
获取图像的像素值并修改 获取图像的属性(信息) 图像的ROI() 图像通道的拆分及合并 1.获取并修改像素值 先读入图像装入一个图像实体,然后该实体相当于一个多维list,可以直接用数组操作提取像素信 ...
- opencv学习笔记(七)---图像金字塔
图像金字塔指的是同一图像不同分辨率的子图的集合,有向下取样金字塔,向上取样金字塔,拉普拉斯金字塔....它是图像多尺度表达的一种,最主要的是用于图像的分割 向下取样金字塔指高分辨率图像向低分辨率图像的 ...
- opencv学习笔记3——图像缩放,翻转和阈值分割
#图像的缩放操作 #cv.resize(src,dsize,dst=None,,fx=None,fy=None,interpolation=None) #src->原图像,dsize->目 ...
- (转) OpenCV学习笔记大集锦 与 图像视觉博客资源2之MIT斯坦福CMU
首页 视界智尚 算法技术 每日技术 来打我呀 注册 OpenCV学习笔记大集锦 整理了我所了解的有关OpenCV的学习笔记.原理分析.使用例程等相关的博文.排序不分先后,随机整理的 ...
- OpenCV 学习笔记 02 使用opencv处理图像
1 不同色彩空间的转换 opencv 中有数百种关于不同色彩空间的转换方法,但常用的有三种色彩空间:灰度.BRG.HSV(Hue-Saturation-Value) 灰度 - 灰度色彩空间是通过去除彩 ...
随机推荐
- 关于rpm包的安装卸载等
在Linux操作系统中,有一个系统软件包,它的功能类似于Windows里面的“添加/删除程序”,但是功能又比“添加/删除程序”强很多,它就是Red Hat Package Manager(简称RPM) ...
- 记一次nodemanager无法启动的情况
早上看CDH发现有一个nodemanager挂掉 然后查看对应的日志. 发现在日志里面并没有错误.,然然后发现服务器的磁盘满了,赶紧清理磁盘空间 清理磁盘的时候发现主要是/tmp目录下面生成了很多 ...
- dedecms sql 替换 或 删除
UPDATE dede_archives SET writer='你需要修改的作者' WHERE writer=''; UPDATE dede_archives SET source='你需要修改的来 ...
- linux 网卡配置详情
1.配置文件/etc/hosts(本地主机ip地址映射,可以有多个别名)./etc/services(端口号与标准服务之间的对应关系)./etc/sysconfig/network(设置主机名,网关, ...
- debug --- 使用Eclipse
debug必知(快捷键若无效,有可能是与其它软件的快捷键发生冲突的原因) 1.F6 —— 单步执行代码,即顺序一行行地执行源码 2.F5 —— 跳入当前调用的函数的内部,即进入函数内部执行源码 ...
- myeclipse 工具栏 Run按钮不见了,怎么调出来啊?
window-->new window,打开新窗口,按钮出现了.关闭老窗口,再关闭新窗口.再次打开MyEclipse,妥妥的了.
- 使用ajax时给ajax绑定上一个进度条的简单示例
直接放代码. <%@ page contentType="text/html;charset=UTF-8" language="java" %> & ...
- Puppet部署:安装puppet server、client
Puppet部署:安装puppet server.client puppet与其他手工操作工具有一个最大的区别就是 puppet的配置具有稳定性,因此你可以多次执行puppet,一旦你更新了你的配 ...
- 网络编程简介(OSI七层协议,TCP协议原理,三次握手与四次挥手)
目录 网络编程 软件开发架构 C/S架构 B/S架构 网络编程的发展史 互联网协议 1.物理连接层 2.数据链路层 3.网络层 4.传输层 5.应用层 三次握手四次挥手 三次握手建链接 数据传输 四次 ...
- http学习--常用请求方法和响应状态码
常用的http请求方法: GET方法:请求服务器资源,并返回 POST方法:向指定资源提交数据进行处理请求(比如说表单,上传文件等).数据被包含在请求体中.POST请求可能会导致新的资源建立或已有资源 ...