在学习B站教学视频的时候记录的笔记
OpenCV+TensorFlow】迪哥带你做项目!深度学习+计算机视觉实战 纯实战教学 技能点加满
3.1 形态学
首先创建一张带毛边的图片如图:
读取图片代码如下:
img = cv2.imread('H:\Peronal\dige.png')
cv2.imshow('img',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
3.1.1 腐蚀操作
注意:腐蚀操作一般都是操作二值图像。
参数描述:
-
img 为原始图像
-
kernel 核
-
iterations 为迭代次数
代码如下:
#腐蚀操作
kernel = np.ones((5,5),np.uint8)
erosion = cv2.erode(img,kernel,iterations=1)
cv2.imshow('erosion',erosion)
cv2.waitKey(0)
cv2.destroyAllWindows()
效果如图:
毛边没了,但线条也细了一些。
再准备一张图片进行测试。如图:
选择一个卷积核3x3,里面的设置不是很重要假设都是1。当使用这个核进行腐蚀的时候,如果中心点在圆形的中心,那么中心周围8个单元都是255,计算结果依然是255相当于没变化。
但腐蚀中心在圆形边缘的时候,中心周围的8格子部分为0
下面测试多次腐蚀代码如下:
pie = cv2.imread('H:\Peronal\pie.png')
kernel = np.ones((30,30),np.uint8)
erosion1 = cv2.erode(pie,kernel,iterations=1)
erosion2 = cv2.erode(pie,kernel,iterations=2)
erosion3 = cv2.erode(pie,kernel,iterations=3)
res = np.hstack((erosion1,erosion2,erosion3))
cv2.imshow('res',res)
cv2.waitKey(0)
cv2.destroyAllWindows()
效果如图:
3.1.2 膨胀操作
与腐蚀相对应的就是膨胀操作。可以理解为腐蚀的你操作。
cv2.dilate(img,kernel,iterations) 参数说明与腐蚀相同。
一下以进行过一次腐蚀操作的的dige.png为例。直接进行膨胀。代码如下:
# 膨胀操作
# erosion为腐蚀过一次dige的图像
kernel = np.ones((3,3),np.uint8)
dige_dilate = cv2.dilate(erosion,kernel,iterations=1)
res = np.hstack((img,erosion,dige_dilate))
cv2.imshow('res',res)
cv2.waitKey(0)
cv2.destroyAllWindows()
以pie图像为例,测试多次膨胀后的效果,代码如下:
pie = cv2.imread('H:\Peronal\pie.png')
kernel = np.ones((30,30),np.uint8)
dilate1 = cv2.dilate(pie,kernel,iterations=1)
dilate2 = cv2.dilate(pie,kernel,iterations=2)
dilate3 = cv2.dilate(pie,kernel,iterations=3)
res = np.hstack((dilate1,dilate2,dilate3))
cv2.imshow('res',res)
cv2.waitKey(0)
cv2.destroyAllWindows()
3.1.3 开运算与闭运算
开运算:先腐蚀,再膨胀
cv2.morphologyEx(img,cv2.MORPH_OPEN,kernel)
参数说明:
-
img 原始图像
-
cv2.MORPH_OPEN 表示为开运算
-
kernel 卷积核
#开运算
img = cv2.imread('H:\Peronal\dige.png')
kernel = np.ones((5,5),np.uint8)
opening = cv2.morphologyEx(img,cv2.MORPH_OPEN,kernel)
cv2.imshow('opening',opening)
cv2.waitKey(0)
cv2.destroyAllWindows()
闭运算:先膨胀,再腐蚀
cv2.morphologyEx(img,cv2.MORPH_LOSE,kernel)
参数说明参考开运算。
代码如下:
# 闭运算
img = cv2.imread('H:\Peronal\dige.png')
kernel = np.ones((5,5),np.uint8)
opening = cv2.morphologyEx(img,cv2.MORPH_CLOSE,kernel)
cv2.imshow('opening',opening)
cv2.waitKey(0)
cv2.destroyAllWindows()
3.1.4 梯度运算
首先退pie图像进行5次第膨胀+腐蚀代码如下:
pie = cv2.imread('H:\Peronal\pie.png')
kernel = np.ones((7,7),np.uint8)
dilate = cv2.dilate(pie,kernel,iterations=5)
erosion = cv2.erode(pie,kernel,iterations=5)
res = np.hstack((dilate,erosion))
cv2.imshow('res',res)
cv2.waitKey(0)
cv2.destroyAllWindows()
在此基础上执行减法,左图-右图,相当于左图超过右图的部分保留,相同的部分设置成黑色。这就是梯度运算
gradient =cv2.morphologyEx(pie,cv2.MORPH_GRADIENT,kernel)
cv2.imshow('gradient',gradient)
cv2.waitKey(0)
cv2.destroyAllWindows()
3.1.5 礼帽与黑帽
-
礼帽 = 原始输入 - 开运算结果
-
黑帽 = 闭运算 - 原始输入
礼帽可以理解为 原始图像去掉 非毛边的部分=毛边,代码如下:
#礼帽 img = cv2.imread('H:\Peronal\dige.png') kernel = np.ones((5,5),np.uint8) tophat = cv2.morphologyEx(img,cv2.MORPH_TOPHAT,kernel) cv2.imshow('tophat',tophat) cv2.waitKey(0) cv2.destroyAllWindows()
-
黑帽:就剩下轮廓
#黑帽 img = cv2.imread('H:\Peronal\dige.png') blackhat = cv2.morphologyEx(img,cv2.MORPH_BLACKHAT,kernel) cv2.imshow('blackhat',blackhat) cv2.waitKey(0) cv2.destroyAllWindows()
-
关于腐蚀与膨胀原理的解释参看下面链接