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")