opencv 之 圖像基本形態學處理

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

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章