1.腐蚀与膨胀
腐蚀
所谓腐蚀就是腐蚀图像的边缘,让图像往里缩,腐蚀程度, 取决于卷积核的大小
import cv2
import matplotlib.pyplot as plt
import numpy as np
# 圆的腐蚀案例 可以看到, 每次腐蚀,都会往里边缩
img_circle = cv2.imread('circle.png')
# 下边的这个kernel 表示腐蚀核的大小,核越小,腐蚀程度越小
kernel = np.ones((30, 30), np.uint8)
erosion_1 = cv2.erode(img_circle, kernel, iterations = 1) # 后边这个表示腐蚀次数, 次数越多,腐蚀越厉害
erosion_2 = cv2.erode(img_circle, kernel, iterations = 2)
erosion_3 = cv2.erode(img_circle, kernel, iterations = 3)
plt.figure(figsize = (12, 12))
plt.subplot(2, 2, 1), plt.imshow(img_circle), plt.title('original')
plt.subplot(2, 2, 2), plt.imshow(erosion_1), plt.title('erosion_1')
plt.subplot(2, 2, 3), plt.imshow(erosion_2), plt.title('erosion_2')
plt.subplot(2, 2, 4), plt.imshow(erosion_3), plt.title('erosion_3')
调整卷积核kernel的大小, 腐蚀程度会随之变化, 如下是腐蚀的一个案例, 去掉边缘多出来的毛刺
import cv2
import matplotlib.pyplot as plt
import numpy as np
img = cv2.imread("fushi.jpg")
kernel = np.ones((5, 5), np.uint8) # 腐蚀卷积核的大小
erosion = cv2.erode(img, kernel, iterations = 1) # 后边的iterations表示腐蚀的次数
plt.figure(figsize=(25, 12))
plt.subplot(2, 3, 1), plt.imshow(img), plt.title('original')
plt.subplot(2, 3, 2), plt.imshow(erosion), plt.title('erosion')
腐蚀操作有很好的,去掉毛刺的效果
膨胀
# 膨胀类似于腐蚀的逆运算
# 如果我们想把上边的 腐蚀操作的毛刺儿去掉,就可以先腐蚀,再膨胀,就可以
img = cv2.imread('fushi.jpg')
kernel = np.ones((5, 5), np.uint8)
dilate_1 = cv2.dilate(img, kernel, iterations = 1)
plt.figure(figsize=(25, 12))
plt.subplot(2, 3, 1), plt.imshow(img), plt.title('original')
plt.subplot(2, 3, 2), plt.imshow(dilate_1), plt.title('dilate_1')
所谓膨胀就是往外扩, 类似于侵略
2. 开闭运算
开运算
# 开运算相当于是先腐蚀,再膨胀,可以达到去除毛刺的效果
import cv2
import matplotlib.pyplot as plt
import numpy as np
img = cv2.imread('fushi.jpg')
kernel = np.ones((5, 5), np.uint8)
opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
plt.figure(figsize=(12, 12))
plt.subplot(2, 2, 1), plt.imshow(img), plt.title('original')
plt.subplot(2, 2, 2), plt.imshow(opening), plt.title('opening')
闭运算
# 闭运算则是先膨胀, 再腐蚀
import cv2
import matplotlib.pyplot as plt
import numpy as np
img = cv2.imread('fushi.jpg')
kernel = np.ones((5, 5), np.uint8)
closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)
plt.figure(figsize=(12, 12))
plt.subplot(2, 2, 1), plt.imshow(img), plt.title('original')
plt.subplot(2, 2, 2), plt.imshow(closing), plt.title('colsing')
3.梯度处理
### 梯度运算 = 膨胀 - 腐蚀
import cv2
import matplotlib.pyplot as plt
import numpy as np
img = cv2.imread('circle.png')
kernel = np.ones((7, 7), np.uint8)
dilate = cv2.dilate(img, kernel, iterations = 2) # 膨胀
erosion = cv2.erode(img, kernel, iterations = 2) # 腐蚀
gradient = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel) # 梯度运算
plt.figure(figsize=(12, 12))
plt.subplot(2, 2, 1), plt.imshow(dilate), plt.title("dilate")
plt.subplot(2, 2, 2), plt.imshow(erosion), plt.title("erosion")
plt.subplot(2, 2, 3), plt.imshow(gradient), plt.title("gradient")
可以看到,膨胀减去腐蚀就是边缘部分
4. 礼帽与黒帽
礼帽: 原始输入 - 开运算结果
# 所谓原始图像就是最先的图像,开运算的结果就是去毛刺之后的,所以,
# 原来的减去去毛刺的就是只剩下毛刺的
img = cv2.imread('fushi.jpg')
kernel = np.ones((7, 7), np.uint8)
tophat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)
plt.figure(figsize=(12, 12))
plt.subplot(2, 2, 1), plt.imshow(img), plt.title("original")
plt.subplot(2, 2, 2), plt.imshow(tophat), plt.title("tophat")
黒帽 : 闭运算 - 原始输入
# 闭运算得到的结果是 图像的边缘部分
img = cv2.imread('fushi.jpg')
kernel = np.ones((7, 7), np.uint8)
tophat = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel)
plt.figure(figsize=(12, 12))
plt.subplot(2, 2, 1), plt.imshow(img), plt.title("original")
plt.subplot(2, 2, 2), plt.imshow(tophat), plt.title("blackhat")