Python下opencv使用笔记(七)(图像梯度与边缘检测)
2015-07-12 16:58
1001 查看
梯度简单来说就是求导,在图像上表现出来的就是提取图像的边缘(不管是横向的、纵向的、斜方向的等等),所需要的无非也是一个核模板,模板的不同结果也不同。所以可以看到,所有的这些个算子函数,归结到底都可以用函数cv2.filter2D()来表示,不同的方法给予不同的核模板,然后演化为不同的算子而已。并且这只是这类滤波函数的一个用途,曾经写过一个关于matlab下滤波函数imfilter()的扩展应用(等同于opencv的cv2.filter2D函数):
图像滤波函数imfilter函数的应用及其扩展
就是很多复杂的计算都是可以通过这个滤波函数组合实现,这样的话速度快。
sobelx=⎡⎣⎢−1−2−1000121⎤⎦⎥\begin{equation} sobel_x=\left[ \begin{matrix} -1&0&1&\\ -2&0&2& \\-1&0&1\end{matrix} \right] \end{equation}
sobely=⎡⎣⎢−101−202−101⎤⎦⎥\begin{equation} sobel_y=\left[ \begin{matrix} -1&-2&-1&\\ 0&0&0& \\1&2&1\end{matrix} \right] \end{equation}
在opencv函数中,还可以设置卷积核(ksize)的大小,如果ksize=-1,就演变为3*3的Scharr算子,模板无非变了个数字:
scharrx=⎡⎣⎢−3−10−30003103⎤⎦⎥\begin{equation} scharr_x=\left[ \begin{matrix} -3&0&3&\\ -10&0&10& \\-3&0&3\end{matrix} \right] \end{equation}
scharry=⎡⎣⎢−303−10010−303⎤⎦⎥\begin{equation} scharr_y=\left[ \begin{matrix} -3&-10&-3&\\ 0&0&0& \\3&10&3\end{matrix} \right] \end{equation}
贴一个相关详细参考:
OpenCV-Python教程(6、Sobel算子)
OpenCV-Python教程(7、Laplacian算子)
其核模板为:
kernel=⎡⎣⎢0101−41010⎤⎦⎥\begin{equation} kernel=\left[ \begin{matrix} 0&1&0&\\ 1&-4&1& \\0&1&0\end{matrix} \right] \end{equation}
下面是对上述三种模板的实例:
![](http://img.blog.csdn.net/20150712165425613)
![](http://img.blog.csdn.net/20150712165438843)
上述一个很重要的问题需要明白的就是,在滤波函数第二个参数,当我们使用-1表示输出图像与输入图像的数据类型一致时,如果原始图像是uint8型的,那么在经过算子计算以后,得到的图像可能会有负值,如果与原图像数据类型一致,那么负值就会被截断变成0或者255,使得结果错误,那么针对这种问题有两种方式改变(上述程序中都有):一种就是改变输出图像的数据类型(第二个参数cv2.CV_64F),另一种就是改变原始图像的数据类型(此时第二个参数可以为-1,与原始图像一致)。
上述程序从结果上也说明使用函数cv2.filter2D也能达到相同的效果。
canny算子
那么opencv中的函数也非常简单,直接cv2.Canny(),这个函数需要五个参数,原始图像,两个范围控制值minVal和maxVal(见上述原理介绍),第四个参数用于规定核模板的大小(默认3),最后一个是true与false(默认)的选择,有一点不同,不太重要,可以试着那个好用那个。
图像滤波函数imfilter函数的应用及其扩展
就是很多复杂的计算都是可以通过这个滤波函数组合实现,这样的话速度快。
(一)关于Sobel算子与Scharr算子
Sobel算子是高斯平滑与微分操作的结合体,所以其抗噪能力很强,用途较多。一般的sobel算子包括x与y两个方向,算子模板为:sobelx=⎡⎣⎢−1−2−1000121⎤⎦⎥\begin{equation} sobel_x=\left[ \begin{matrix} -1&0&1&\\ -2&0&2& \\-1&0&1\end{matrix} \right] \end{equation}
sobely=⎡⎣⎢−101−202−101⎤⎦⎥\begin{equation} sobel_y=\left[ \begin{matrix} -1&-2&-1&\\ 0&0&0& \\1&2&1\end{matrix} \right] \end{equation}
在opencv函数中,还可以设置卷积核(ksize)的大小,如果ksize=-1,就演变为3*3的Scharr算子,模板无非变了个数字:
scharrx=⎡⎣⎢−3−10−30003103⎤⎦⎥\begin{equation} scharr_x=\left[ \begin{matrix} -3&0&3&\\ -10&0&10& \\-3&0&3\end{matrix} \right] \end{equation}
scharry=⎡⎣⎢−303−10010−303⎤⎦⎥\begin{equation} scharr_y=\left[ \begin{matrix} -3&-10&-3&\\ 0&0&0& \\3&10&3\end{matrix} \right] \end{equation}
贴一个相关详细参考:
OpenCV-Python教程(6、Sobel算子)
(二)关于拉普拉斯(Laplacian)算子
拉普拉斯算子可以实现图像的二阶倒数的定义,至于二阶倒数有什么意义,可以看这位博主的详细介绍:OpenCV-Python教程(7、Laplacian算子)
其核模板为:
kernel=⎡⎣⎢0101−41010⎤⎦⎥\begin{equation} kernel=\left[ \begin{matrix} 0&1&0&\\ 1&-4&1& \\0&1&0\end{matrix} \right] \end{equation}
下面是对上述三种模板的实例:
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中的函数也非常简单,直接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 对字典排序
- Selenium学习笔记之001:Selenium+Eclipse+Python测试环境搭建
- Python实现简单的爬虫
- Python下opencv使用笔记(六)(图像的形态学转换)
- python学习笔记——列表在做extend,+=和+的时候对象的变化与内存分配
- python学习笔记——循环里的else
- HTML+CSS+python+qtwebkit打造跨平台桌面应用(一)
- HTML+CSS+python+qtwebkit打造跨平台桌面应用(二)
- HTML+CSS+python+qtwebkit打造跨平台桌面应用(三)
- Python3.x爬虫教程:爬网页、爬图片、自动登录
- python IDE
- pandas安装过程中提示unable to find vcvarsall.bat的解决方法
- 简单上手Python中装饰器的使用
- 利用python3 requests和BeautifulSoup4抓取百度贴吧研究生录取通知书并展示
- nltk在python中的安装,以及nltk的data库
- Python 类的继承
- python学习笔记——‘is’和‘==’的区别
- NAO机器人系统下模块生成和python模块调用
- Python爬虫初步
- python while循环控制