您的位置:首页 > 编程语言 > Python开发

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()


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: