vim+python+OpenCV学习六 : 形态学初级

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值