vim+python+OpenCV学习六 : 形态学初级
2016-03-05 20:59
501 查看
#coding=utf-8 import cv2 import numpy as np img=cv2.imread(r'test1.jpg') ''' NpKernel = np.uint8(np.zeros((5,5))) for i in range(5): NpKernel[2, i] = 1 #numpy定义结果元素 NpKernel[i, 2] = 1 ''' #opencv定义的结构元素 kernel=cv2.getStructuringElement(cv2.MORPH_RECT,(20,20)) #腐蚀图像 eroded=cv2.erode(img,kernel) cv2.imshow("Eroded Image",eroded) #膨胀图像 dilated=cv2.dilate(img,kernel) cv2.imshow("Dilated Image",dilated) cv2.imshow("Origin",img) #Numpy定义的结构元素 NpKernel=np.uint8(np.ones((20,20))) Nperoded=cv2.erode(img,NpKernel) cv2.imshow("Eroded by Numpy kernel",Nperoded) cv2.waitKey(0) cv2.destroyAllWindows()
#coding=utf-8 import cv2 import numpy as np #开运算与闭运算 img=cv2.imread(r'test1.jpg') #opencv定义的结构元素 kernel=cv2.getStructuringElement(cv2.MORPH_RECT,(20,20)) #闭运算 closed=cv2.morphologyEx(img,cv2.MORPH_CLOSE,kernel) cv2.imshow("Close",closed) #开运算 opened=cv2.morphologyEx(img,cv2.MORPH_OPEN,kernel) cv2.imshow("Open",opened) cv2.imshow("Origin",img) cv2.waitKey(0) cv2.destroyAllWindows()
闭运算用来连接被误分为许多小块的对象,而开运算用于移除由图像噪音形成的斑点。因此,某些情况下可以连续运用这两种运算。如对一副二值图连续使用闭运算和开运算,将获得图像中的主要对象。同样,如果想消除图像中的噪声(即图像中的“小点”),也可以对图像先用开运算后用闭运算,不过这样也会消除一些破碎的对象。
#coding=utf-8 import cv2 import numpy as np #检测边缘 ''' 形态学检测边缘的原理很简单,在膨胀时,图像中的物体会想周围 “扩张”;腐蚀时,图像中的物体会“收缩”。比较这两幅图像, 由于其变化的区域只发生在边缘。所以这时将两幅图像相减, 得到的就是图像中物体的边缘。 ''' img=cv2.imread(r'test1.jpg') #opencv定义的结构元素 kernel=cv2.getStructuringElement(cv2.MORPH_RECT,(3,3)) #获得膨胀和腐蚀的图片 dilate=cv2.dilate(img,kernel) erode=cv2.erode(img,kernel) #将两幅图像相减获得边,第一个参数是膨胀后的图像,第二个参数是腐蚀后的图像 result=cv2.absdiff(dilate,erode) ##上面得到的结果是灰度图,将其二值化以便更清楚的观察结果 retval, result = cv2.threshold(result, 40, 255, cv2.THRESH_BINARY) #反色,即对二值图每个像素取反 result = cv2.bitwise_not(result) cv2.imshow("result",result) cv2.waitKey(0) cv2.destroyAllWindows()
#coding=utf-8 import cv2 import numpy as np #检测边缘 ''' 与边缘检测不同,拐角的检测的过程稍稍有些复杂。但原理相同, 所不同的是先用十字形的结构元素膨胀像素,这种情况下只会在边缘处“扩张”, 角点不发生变化。接着用菱形的结构元素腐蚀原图像,导致只有在拐角处才会“收缩”, 而直线边缘都未发生变化。 第二步是用X形膨胀原图像,角点膨胀的比边要多。这样第二次用方块腐蚀时, 角点恢复原状,而边要腐蚀的更多。所以当两幅图像相减时,只保留了拐角处。 ''' image=cv2.imread(r'test4.jpg',0)#0是灰度图 imageView=cv2.imread(r'test4.jpg') ''' cv2.imread():读入图片,共两个参数,第一个参数为要读入的图片文件名, 第二个参数为如何读取图片,包括cv2.IMREAD_COLOR:读入一副彩色图片; cv2.IMREAD_GRAYSCALE:以灰度模式读入图片;cv2.IMREAD_UNCHANGED :读入一幅图片,并包括其alpha通道。 不止这些标志 ''' #构造5× 5的结构元素,分别为十字形、菱形、方形和X型 #下面是十字形 cross=cv2.getStructuringElement(cv2.MORPH_CROSS,(5,5)) #菱形 diamond=cv2.getStructuringElement(cv2.MORPH_RECT,(5,5)) diamond[0, 0] = 0 diamond[0, 1] = 0 diamond[0, 3] = 0 diamond[0, 4] = 0 diamond[1, 0] = 0 diamond[1, 4] = 0 diamond[3, 0] = 0 diamond[3, 4] = 0 diamond[4, 0] = 0 diamond[4, 1] = 0 diamond[4, 3] = 0 diamond[4, 4] = 0 #方形 square=cv2.getStructuringElement(cv2.MORPH_RECT,(5,5)) #x形,可以自己设置,原来的只有,方,十,椭圆。 x=cv2.getStructuringElement(cv2.MORPH_RECT,(5,5)) x[0, 1] = 0 x[0, 2] = 0 x[0, 3] = 0 x[1, 0] = 0 x[1, 2] = 0 x[1, 4] = 0 x[2, 0] = 0 x[2, 1] = 0 x[2, 3] = 0 x[2, 4] = 0 x[3, 0] = 0 x[3, 2] = 0 x[3, 4] = 0 x[4, 1] = 0 x[4, 2] = 0 x[4, 3] = 0 #使用cross膨胀图像,和下面任选 result1=cv2.dilate(image,cross) #使用菱形腐蚀图像 #result1=cv2.erode(result1,diamond) #使用x膨胀图像 #result2=cv2.dilate(image,x) #使用方形腐蚀图像 result2=cv2.erode(result1,square) #将两幅闭运算的图像相减获得角 result = cv2.absdiff(result2, result1) #使用阈值获得二值图 jiangyou,result = cv2.threshold(result, 40, 255, cv2.THRESH_BINARY) #这个jiangyou,是为了和result形成一个元组,不是打酱油的 #在原图上用半径为5的圆圈将点标出 for j in range(result.size): y=j/result.shape[0] x=j%result.shape[0] if result[x,y]==255: cv2.circle(imageView,(y,x),10,(0,255,0)) cv2.imshow("result",imageView) cv2.waitKey(0) cv2.destroyAllWindows()
相关文章推荐
- python模拟登陆
- Python中lambda表达式学习
- 集体智慧编程——协同过滤推荐算法-Python实现
- 在 Mac OS X 10.9 搭建 Python3 科学计算环境
- Python和OpenCV环境配置
- 主成分分析法以及python实现
- python的异常处理及支持中文注释
- Python 代码调试技巧
- python解析xml文件
- Python的单引号、双引号和三引号的字符串
- python安装mysqldb
- python基础(List,Dictionary,Random,循环,Lambda,Tumple)
- python 操作注册表
- Python批量重命名
- python and or and-or
- python爬虫方法小结
- python面试题
- 编程学习第二天,初识Python
- python 小练习之山寨版markdown格式txt文件转html文件
- Python爬虫爬取一篇韩寒新浪博客