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