形態學操作在影像處理中有多種應用,特別是在處理二值化影像(黑白影像)。
在影像處理應用上,基本上都由侵蝕,膨脹這兩種方法,組合搭配而成。


膨脹運算圖

侵蝕運算圖
常見應用場景
- 物體檢測與分割:
- 形態學操作可以用於增強或改善二值化影像中的物體邊界,使得物體的檢測和分割更加準確。這對於計算機視覺中的目標檢測和分割任務非常有用。
- OpenCV與有提供一個圖像分割的演算法watershed,敝人文章連結如下:
- [OpenCV應用][Python]應用watershed分割圖像(硬幣分割)
- 雜訊去除:
- 在二值化影像中,形態學操作可以用來去除小的雜訊點,使影像更加清晰。侵蝕操作特別適合這一應用,它可以消除小的斑點和細小連接,而不影響主要的物體結構。
- 填充與洞補:
- 閉運算可以用來填充物體內的小洞,使物體更加完整。
- 文本的二值化:
- 在光學字符識別(OCR)等應用中,形態學操作可以用來處理二值化的圖像,增強文本區域的形狀,使得字符更容易被識別。
- 圖像的特徵提取:
- 形態學操作可以用於提取影像中的結構和特徵,例如提取圖像中的邊緣、角點等。這對於後續的圖像分析和特徵識別非常重要。
膨脹(Dilation):
通常用於擴大和強調二值影像中的物體。膨脹的效果是將物體的邊界擴張。
import cv2
import numpy as np
# 讀取二值影像
binary_image = cv2.imread('binary_image.jpg', cv2.IMREAD_GRAYSCALE)
# 定義膨脹的結構元素
kernel = np.ones((5, 5), np.uint8)
# 進行膨脹操作
dilated_image = cv2.dilate(binary_image, kernel, iterations=2)
cv2.imread('binary_image.jpg', cv2.IMREAD_GRAYSCALE)
:
1. 使用OpenCV的imread
函數讀取名為'binary_image.jpg'的影像
2. 並使用cv2.IMREAD_GRAYSCALE
將其轉換為灰度影像。
np.ones((5, 5), np.uint8)
:
1. 創建一個大小為 (5, 5) 的二維NumPy陣列,所有元素都是1,並指定數據類型為 np.uint8
2. 這個陣列被用作侵蝕操作的結構元素,它決定了侵蝕的形狀和大小。
cv2.dilate(binary_image, kernel, iterations=1)
:
1. binary_image
:要進行膨脹的影像,這裡是灰度影像。
2. kernel
:膨脹的結構元素。
3. iterations
:膨脹的迭代次數,可以控制膨脹的程度。在這裡設定為2,表示進行二次膨脹操作。
侵蝕(Erosion):
通常用於縮小和平滑二值影像中的物體。侵蝕的效果是將物體的邊界收縮。
import cv2
import numpy as np
# 讀取二值影像
binary_image = cv2.imread('binary_image.jpg', cv2.IMREAD_GRAYSCALE)
# 定義侵蝕的結構元素
kernel = np.ones((5, 5), np.uint8)
# 進行侵蝕操作
eroded_image = cv2.erode(binary_image, kernel, iterations=1)
cv2.erode(binary_image, kernel, iterations=1)
:
1. binary_image
:要進行侵蝕的影像,這裡是灰度影像。
2. kernel
:侵蝕的結構元素。
3. iterations
:侵蝕的迭代次數,可以控制侵蝕的程度。在這裡設定為1,表示進行一次侵蝕操作。
形態學梯度運算
(Morphological Gradient)是形態學操作的一種,膨脹的圖減去侵蝕的圖,通常用於檢測物體的邊緣。它是膨脹操作和侵蝕操作的差異。
import cv2
import numpy as np
# 讀取影像
image = cv2.imread('your_image.jpg', cv2.IMREAD_GRAYSCALE)
# 定義膨脹的結構元素
dilation_kernel = np.ones((5, 5), np.uint8)
# 定義侵蝕的結構元素
erosion_kernel = np.ones((5, 5), np.uint8)
# 進行膨脹操作
dilated_image = cv2.dilate(image, dilation_kernel, iterations=1)
# 進行侵蝕操作
eroded_image = cv2.erode(image, erosion_kernel, iterations=1)
# 形態學梯度運算:膨脹的結果減去侵蝕的結果
morphological_gradient = cv2.subtract(dilated_image, eroded_image)
# 顯示原始影像、膨脹結果、侵蝕結果和形態學梯度結果
cv2.imshow('Original Image', image)
cv2.imshow('Dilated Image', dilated_image)
cv2.imshow('Eroded Image', eroded_image)
cv2.imshow('Morphological Gradient', morphological_gradient)
cv2.waitKey(0)
cv2.destroyAllWindows()

梯度運算