形态学-腐蚀操作
留意腐蚀是黑腐蚀白色
本章用到的图(网上竟然没什么好用来学习的图!)
对应的图片名字:morphology_cv.jpg、dige.png、pie.png
腐蚀是判断区域内是否都是1,如果不是就等于0
查看图
img = cv2.imread('morphology_cv.jpg')
cv2.imshow('img', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
#定义卷积核,3*3,值全为1
kernel = np.ones((3,3),np.uint8)
erosion = cv2.erode(img,kernel,iterations = 1)
cv2.imshow('erosion', erosion)
cv2.waitKey(0)
cv2.destroyAllWindows()
腐蚀结果
加大卷积核
kernel = np.ones((5,5),np.uint8)
erosion = cv2.erode(img,kernel,iterations = 1)
cv2.imshow('erosion', erosion)
cv2.waitKey(0)
cv2.destroyAllWindows()
对拼图进行腐蚀
kernel = np.ones((30,30),np.uint8)
erosion_1 = cv2.erode(pie,kernel,iterations = 1)
erosion_2 = cv2.erode(pie,kernel,iterations = 2)
erosion_3 = cv2.erode(pie,kernel,iterations = 3)
res = np.hstack((erosion_1,erosion_2,erosion_3))
cv2.imshow('res', res)
cv2.waitKey(0)
cv2.destroyAllWindows()
形态学-膨胀操作(与腐蚀有点像逆运算)
下面的膨胀效果相当于线条变粗
进行腐蚀操作,线条会受到一些损害;
希望通过膨胀来将损害的线条还原
kernel = np.ones((3,3),np.uint8)
dige_dilate = cv2.dilate(dige_erosion,kernel,iterations = 1)
cv2.imshow('dilate', dige_dilate)
cv2.waitKey(0)
cv2.destroyAllWindows()
me:有点像图像平滑中的方框滤波
只不过腐蚀操作像是把黑色当成0,白色当成1,1与0取求和(不归一化)后成1了,于是本来黑色的地方通过卷积变成了白色
以上刚好腐蚀相反
对应饼图
pie = cv2.imread('pie.png')
kernel = np.ones((30,30),np.uint8)
dilate_1 = cv2.dilate(pie,kernel,iterations = 1)
dilate_2 = cv2.dilate(pie,kernel,iterations = 2)
dilate_3 = cv2.dilate(pie,kernel,iterations = 3)
res = np.hstack((dilate_1,dilate_2,dilate_3))
cv2.imshow('res', res)
cv2.waitKey(0)
cv2.destroyAllWindows()
开运算与闭运算
开运算
# 开:先腐蚀(刺变小),再膨胀(恢复)
# 不带刺
img = cv2.imread('morphology_cv.jpg')
kernel = np.ones((3,3),np.uint8)
opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
cv2.imshow('opening', opening)
cv2.waitKey(0)
cv2.destroyAllWindows()
闭运算
# 闭:先膨胀,再腐蚀
# 把刺头先扩大了,后面腐蚀不一定能够刺头腐蚀掉
# 刺更多了
img = cv2.imread('morphology_cv.jpg')
kernel = np.ones((5,5),np.uint8)
closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)
cv2.imshow('closing', closing)
cv2.waitKey(0)
cv2.destroyAllWindows()
梯度运算
# morphology形态学
# 梯度=膨胀-腐蚀,最后剩下轮廓
gradient = cv2.morphologyEx(pie, cv2.MORPH_GRADIENT, kernel)
cv2.imshow('gradient', gradient)
cv2.waitKey(0)
cv2.destroyAllWindows()
礼帽与黑帽
- 礼帽 = 原始输入(带刺的)-开运算结果(去了刺) 结果是剩下刺的
- 黑帽 = 闭运算(比原来的图像变大了一点)-原始输入 结果剩轮廓
礼帽
#礼帽
img = cv2.imread('dige.png')
tophat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)
cv2.imshow('tophat', tophat)
cv2.waitKey(0)
cv2.destroyAllWindows()
黑帽
#黑帽
img = cv2.imread('morphology_cv.jpg')
blackhat = cv2.morphologyEx(img,cv2.MORPH_BLACKHAT, kernel)
cv2.imshow('blackhat ', blackhat )
cv2.waitKey(0)
cv2.destroyAllWindows()