什麼是形態學操作?

在圖像處理中,形態學操作是一類基於圖像形狀的處理方法。它的核心思想是通過結構元素(Kernel) 與圖像進行交互,改變圖像中物體的形狀特徵。形態學操作主要用於二值圖像(黑白圖像),通過“膨脹”“腐蝕”等基本運算,實現去噪、連接斷裂物體、填充孔洞等效果。

形態學操作的基本類型

形態學操作有多種基本形式,其中最核心的是以下四種:

1. 腐蝕(Erosion)

原理:腐蝕可以理解爲“縮小”圖像中的亮區域(白色部分),或“擴大”暗區域(黑色部分)。它通過結構元素掃描圖像,將結構元素覆蓋區域內的所有像素設置爲最小值(若結構元素覆蓋區域內存在0,整體結果爲0)。

效果:去除圖像中的小亮點(噪點),但會使物體邊緣“收縮”,可能導致物體變小甚至消失。

2. 膨脹(Dilation)

原理:與腐蝕相反,膨脹是“擴大”圖像中的亮區域。它通過結構元素掃描圖像,將結構元素覆蓋區域內的所有像素設置爲最大值(若結構元素覆蓋區域內存在255,整體結果爲255)。

效果:填充圖像中的小暗洞(孔洞),使物體邊緣“膨脹”,可能連接斷裂的物體。

3. 開運算(Opening)

原理:開運算 = 先腐蝕後膨脹。先通過腐蝕去除小噪點,再通過膨脹恢復物體的原始大小。

效果:去除圖像中的小噪點,同時保留物體的整體形狀(常用作去噪處理)。

4. 閉運算(Closing)

原理:閉運算 = 先膨脹後腐蝕。先通過膨脹填充小暗洞,再通過腐蝕去除膨脹後物體邊緣的“毛刺”。

效果:填充圖像中的小暗洞,使物體邊緣更光滑(常用作修復斷裂物體)。

結構元素(Kernel)

結構元素是一個小型矩陣,用於定義形態學操作的“形狀”和“大小”。OpenCV通過cv2.getStructuringElement()創建結構元素,常見形狀包括:
- cv2.MORPH_RECT:矩形
- cv2.MORPH_ELLIPSE:橢圓形
- cv2.MORPH_CROSS:十字形

代碼實現:從讀取圖像到形態學操作

步驟1:導入庫和準備圖像

首先導入cv2(OpenCV)和numpy庫,讀取一張帶噪點的二值圖像(若沒有現成圖像,可使用cv2.imread()讀取本地圖片)。

import cv2
import numpy as np
import matplotlib.pyplot as plt

# 讀取圖像(灰度模式)
img = cv2.imread('noisy_image.png', 0)  # 0表示灰度模式,路徑需替換爲實際圖像路徑

# 二值化處理(將圖像轉爲黑白二值圖,大於127的像素設爲255,否則0)
_, binary = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)

步驟2:定義結構元素

創建一個3×3的矩形結構元素(可根據需求調整大小和形狀):

# 創建3x3矩形結構元素
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))

步驟3:執行形態學操作

分別進行腐蝕、膨脹、開運算、閉運算,並顯示結果:

# 1. 腐蝕操作
erosion = cv2.erode(binary, kernel, iterations=1)

# 2. 膨脹操作
dilation = cv2.dilate(binary, kernel, iterations=1)

# 3. 開運算(先腐蝕後膨脹)
opening = cv2.morphologyEx(binary, cv2.MORPH_OPEN, kernel)

# 4. 閉運算(先膨脹後腐蝕)
closing = cv2.morphologyEx(binary, cv2.MORPH_CLOSE, kernel)

步驟4:顯示結果

使用matplotlib對比展示原始圖像和處理後的結果:

# 顯示結果
plt.figure(figsize=(12, 8))
plt.subplot(2, 2, 1), plt.imshow(binary, 'gray'), plt.title('原始圖像')
plt.subplot(2, 2, 2), plt.imshow(erosion, 'gray'), plt.title('腐蝕結果')
plt.subplot(2, 2, 3), plt.imshow(opening, 'gray'), plt.title('開運算結果')
plt.subplot(2, 2, 4), plt.imshow(closing, 'gray'), plt.title('閉運算結果')
plt.tight_layout()
plt.show()

效果對比與解釋

  • 原始圖像:帶有小噪點的二值圖像(假設圖像中有白色噪點和一個小物體)。
  • 腐蝕結果:噪點被部分去除,但小物體邊緣收縮,可能變小。
  • 開運算結果:噪點被完全去除,小物體形狀基本保持不變(先腐蝕去噪,再膨脹恢復大小)。
  • 閉運算結果:圖像中的小暗洞被填充,物體邊緣更光滑(先膨脹補洞,再腐蝕優化邊緣)。

進階操作(可選)

  • 形態學梯度:膨脹結果 - 腐蝕結果,可提取物體邊緣(如cv2.morphologyEx(binary, cv2.MORPH_GRADIENT, kernel))。
  • 頂帽(Top Hat):原始圖像 - 開運算結果,用於提取小噪點(cv2.MORPH_TOPHAT)。
  • 黑帽(Black Hat):閉運算結果 - 原始圖像,用於提取小暗洞(cv2.MORPH_BLACKHAT)。

總結

形態學操作是圖像處理的基礎工具,通過腐蝕、膨脹等基本運算,可實現去噪、連接物體、提取邊緣等功能。初學者可從開運算閉運算入手,結合結構元素調整大小,逐步掌握不同場景下的形態學應用。

練習建議:嘗試替換不同的圖像路徑,調整結構元素大小(如5×5),觀察結果變化,理解參數對效果的影響。

小夜