形态学处理
腐蚀,膨胀
腐蚀
效果就是暗的地方侵入亮的地方
使用:
给一个结构元(二维数组),结构元中有一个锚点,计算过程就是如果结构元对应的区域有暗的,那锚点就变为暗的
记作:
import cv2 as cv
import numpy as np
s=cv.getStructuringElement(cv.MORPH_RECT,(3,3))#获得核,比较大时用这个,小的话自己画也行。参数:形状,尺寸
src=cv.imread(r'C:\Users\19583\Desktop\3.jpg',cv.IMREAD_GRAYSCALE)
src=cv.resize(src,(500,500))
dst=cv.erode(src,s,iterations=1)#腐蚀函数,参数:图,核,腐蚀次数
cv.imshow('src',src)
cv.imshow('dst1',dst)
cv.waitKey(0)
另外,当腐蚀次数增加,和大小增加,块会越来越接近核的形状(好像也没什么用)
膨胀
与上面相反
记作圈中间一个加号(腐蚀是减号)
直接给代码:
python
import cv2 as cv
import numpy as np
s=cv.getStructuringElement(cv.MORPH_RECT,(3,3))#获得核,比较大时用这个,小的话自己画也行。参数:形状,尺寸
src=cv.imread(r'C:\Users\19583\Desktop\3.jpg',cv.IMREAD_GRAYSCALE)
src=cv.resize(src,(500,500))
dst=cv.dilate(src,s,iterations=1)#腐蚀函数,参数:图,核,腐蚀次数
cv.imshow('src',src)
cv.imshow('dst1',dst)
cv.waitKey(0)
开运算与闭运算
基于腐蚀与膨胀
这个直接用开闭运算就可以实现,opencv给了现成的函数:
import cv2 as cv
import numpy as np
src=cv.imread(r'C:\Users\19583\Desktop\3.jpg',cv.IMREAD_GRAYSCALE)
src=cv.resize(src,(500,500))
a=np.array([[1,1,1],[1,1,1],[1,1,1]],dtype=np.float32)
dst1=cv.morphologyEx(src,cv.MORPH_OPEN,a,iterations=1)#图,模式,核,次数
dst2=cv.morphologyEx(src,cv.MORPH_CLOSE,a,iterations=1)
cv.imshow('src',src)
cv.imshow('dst1',dst1)
cv.imshow('dst2',dst2)
cv.waitKey(0)
其他形态学操作
这些在morphologyEx中都有
import cv2 as cv
import numpy as np
src=cv.imread(r'C:\Users\19583\Desktop\3.jpg',cv.IMREAD_GRAYSCALE)
src=cv.resize(src,(500,500))
a=np.array([[1,1,1],[1,1,1],[1,1,1]],dtype=np.float32)
dst1=cv.morphologyEx(src,cv.MORPH_BLACKHAT,a,iterations=1)#地貌
dst2=cv.morphologyEx(src,cv.MORPH_TOPHAT,a,iterations=1)#顶帽
dst3=cv.morphologyEx(src,cv.MORPH_GRADIENT,a,iterations=1)#形态学梯度
cv.imshow('src',src)
cv.imshow('dst1',dst1)
cv.imshow('dst2',dst2)
cv.imshow('dst3',dst3)
cv.waitKey(0)