1、腐蚀操作
1.1 腐蚀
首先读进来并打印一张图
img = cv2.imread('yzy.jpg')
cv2.imshow('img', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
这个图片出现了一些毛刺,看着挺难受
执行一个腐蚀操作,再将图片打印出来:
kernel = np.ones((3,3),np.uint8)
erosion = cv2.erode(img,kernel,iterations = 1)
cv2.imshow('erosion', erosion)
cv2.waitKey(0)
cv2.destroyAllWindows()
打印结果:
毛刺全部没有了
1.2 腐蚀原理
再读进来一个圆形的图片
pie = cv2.imread('pie.png')
cv2.imshow('pie', pie)
cv2.waitKey(0)
cv2.destroyAllWindows()
打印结果:
在这个过程可以比较容易理解到腐蚀的原理,比如我们指定了一个(3,3)的卷积核kernel,他会将一个像素和周围的8个像素进行计算,如果是在这个图中,在黑色部分和白色部分的计算结果都会是不变的,因为卷积核内的所有像素都一样,而在黑白交界出的计算肯定会使得白色变黑了。
所以经过erode函数进行腐蚀操作,这个白色圈的外圈就会被腐蚀一部分,可以进行多次腐蚀操作:
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()
多次腐蚀的图片变化:
其中这个iterations就是指的是迭代次数。
2、膨胀操作
读进来前面的图片,进行腐蚀操作,腐蚀后的图像的毛刺没有了,但是线条也没有原来粗了。
使用dilate函数进行膨胀操作,并且将结果打印出来:
kernel = np.ones((3,3),np.uint8)
yzy_erosion = cv2.erode(img,kernel,iterations = 1)
cv2.imshow('erosion', erosion)
cv2.waitKey(0)
cv2.destroyAllWindows()
打印结果:
膨胀后得结果,线条又变粗了。
将白色圆的图片进行两次膨胀:
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()
打印结果:
3、开运算与闭运算
开运算就是把腐蚀、膨胀结合在一起
开运算:先腐蚀,再膨胀
闭运算: 先膨胀,再腐蚀
开运算:
morphologyEx函数,cv2.MORPH_OPEN参数
# 开:先腐蚀,再膨胀
img = cv2.imread('yzy.jpg')
kernel = np.ones((5,5),np.uint8)
opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
cv2.imshow('opening', opening)
cv2.waitKey(0)
cv2.destroyAllWindows()
打印结果:
闭运算:
morphologyEx函数,cv2.MORPH_CLOSE参数
# 闭:先膨胀,再腐蚀
img = cv2.imread('yzy.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()
打印结果:
4、梯度运算
梯度运算 = 膨胀-腐蚀
对刚刚的圆形图,先进行5次膨胀,然后进行5次腐蚀:
# 梯度=膨胀-腐蚀
pie = cv2.imread('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()
打印结果:
5、礼帽与黑帽
礼帽:原始图-开运算
黑帽:闭运算-原始图
礼帽
前面提到yzy.jpg这张图,原始图包含了一些毛刺,腐蚀后就没了毛刺,腐蚀再膨胀几乎就是原始图去掉了毛刺,这就是开运算操作,原始图再减去开运算的记过那不就只剩下原始图的那些毛刺了吗?
morphologyEx函数,cv2.MORPH_TOPHAT参数
#礼帽
img = cv2.imread('dige.png')
tophat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)
cv2.imshow('tophat', tophat)
cv2.waitKey(0)
cv2.destroyAllWindows()
打印结果:
黑帽
morphologyEx函数,cv2.MORPH_BLACKHAT参数
#黑帽
img = cv2.imread('yzy.jpg')
blackhat = cv2.morphologyEx(img,cv2.MORPH_BLACKHAT, kernel)
cv2.imshow('blackhat ', blackhat )
cv2.waitKey(0)
cv2.destroyAllWindows()
打印结果: