在影像處理中,形態學操作是非常重要的一種技術,能夠幫助我們去除噪點、強化特徵、修復物體的形狀等。形態學操作的核心是「結構元素」(kernel),不同形狀的結構元素會產生不同的處理效果。本文將介紹如何使用不同形狀的結構元素來進行圖像處理,並結合實際程式範例和測試圖片來說明其效果。
cv2.MORPH_RECT
)cv2.MORPH_ELLIPSE
)cv2.MORPH_CROSS
)我們使用包含多種噪點和形狀的圖像來進行測試,這張圖片包含小圓形雜點、矩形區域和其他不規則噪點。
import cv2
import numpy as np
import matplotlib.pyplot as plt
# 讀取測試圖片
image = cv2.imread('圖片路徑', cv2.IMREAD_GRAYSCALE)
_, binary = cv2.threshold(image, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)
# 定義不同形狀的結構元素
kernel_size = 55
rect_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (kernel_size, kernel_size))
ellipse_kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (kernel_size, kernel_size))
cross_kernel = cv2.getStructuringElement(cv2.MORPH_CROSS, (kernel_size, kernel_size))
# 開運算
rect_opening = cv2.morphologyEx(binary, cv2.MORPH_OPEN, rect_kernel)
ellipse_opening = cv2.morphologyEx(binary, cv2.MORPH_OPEN, ellipse_kernel)
cross_opening = cv2.morphologyEx(binary, cv2.MORPH_OPEN, cross_kernel)
# 顯示結果
titles = ['binary', 'Rect Kernel Opening', 'Ellipse Kernel Opening', 'Cross Kernel Opening']
images = [binary, rect_opening, ellipse_opening, cross_opening]
plt.figure(figsize=(5, 5)) # 調整窗口的大小,避免圖片被壓縮
for i in range(4):
plt.subplot(2, 2, i+1)
plt.imshow(images[i], cmap='gray')
plt.title(titles[i])
plt.xticks([]), plt.yticks([])
plt.tight_layout() # 自動調整子圖的間距,避免重疊
plt.show()
matplotlib
顯示原始圖片和經過不同結構元素處理後的結果。在形態學操作中,結構元素的大小和形狀對結果有著決定性的影響。當你使用較大的結構元素時,形態學操作會對圖像產生更強烈的作用,只保留與結構元素大小和形狀相似的物體。
如下圖,使用比較大的結構元素時,只保留了相似形狀的物體其他都濾除掉了。
矩形結構元素幾乎把全部都快濾除掉了,十字形結構元素都留下了邊邊角角,
橢圓形結構保留了圓形的物件。