跳轉到

12.2-邊緣檢測與分割技術

邊緣檢測與分割技術 是計算機視覺和影像處理中兩個非常重要的領域,通常應用於圖像分析、物體識別、醫學影像處理、影像檢索等。這些技術的目的是從圖像中提取出結構信息,識別物體的邊界,並將圖像分割成有意義的區域,以便後續處理或分析。

邊緣檢測(Edge Detection)#

邊緣檢測是圖像處理中的一個基本任務,目的是識別圖像中像素強度變化較大的區域,這些區域通常代表了物體的邊界或細節。邊緣檢測通常依賴於檢測圖像中灰度值的急劇變化。

邊緣檢測的基本原理#

邊緣是圖像中亮度或顏色變化最大的地方。邊緣檢測算法通常尋找圖像中亮度變化最大的區域,並標出這些區域。這些變化通常表現為像素強度的梯度。

常見的邊緣檢測方法#

  1. Sobel算子(Sobel Operator) Sobel算子是一種簡單的邊緣檢測算子,它通過計算圖像在水平方向和垂直方向的梯度來檢測邊緣。Sobel算子使用兩個小的卷積核(Gx和Gy)來計算圖像在水平方向和垂直方向的梯度。

  2. 水平方向(Gx): [ G_x = \begin{pmatrix} -1 & 0 & 1 \ -2 & 0 & 2 \ -1 & 0 & 1 \end{pmatrix} ]

  3. 垂直方向(Gy): [ G_y = \begin{pmatrix} -1 & -2 & -1 \ 0 & 0 & 0 \ 1 & 2 & 1 \end{pmatrix} ]

結果是將水平方向和垂直方向的梯度合併,通常使用梯度大小(Magnitude)來描述邊緣的強度。

  1. Canny邊緣檢測(Canny Edge Detection) Canny邊緣檢測是最常用的邊緣檢測算法之一,它包含幾個步驟:
  2. 高斯濾波:去除噪聲。
  3. 梯度計算:計算每個像素的梯度。
  4. 非最大抑制:保留強度最大的邊緣像素。
  5. 雙閾值處理:確定邊緣的確定性。

Canny算法是一種多步驟的算法,其效果通常比Sobel算法更好,尤其在噪聲較多的情況下。

  1. Laplace算子 Laplace算子是基於二階導數的邊緣檢測方法,它直接計算圖像中亮度變化的二階導數,適合於強邊緣的檢測。常見的Laplace算子是: [ \nabla^2 = \begin{pmatrix} 0 & 1 & 0 \ 1 & -4 & 1 \ 0 & 1 & 0 \end{pmatrix} ]

  2. Prewitt算子 Prewitt算子和Sobel算子類似,主要用於計算水平方向和垂直方向的邊緣強度。其核類似Sobel算子,但權重略有不同。

Python 範例:使用 OpenCV 進行 Canny 邊緣檢測#

import cv2
import matplotlib.pyplot as plt

# 讀取圖像
image = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)

# 使用 Canny 邊緣檢測
edges = cv2.Canny(image, 100, 200)

# 顯示結果
plt.figure(figsize=(10, 5))
plt.subplot(1, 2, 1)
plt.imshow(image, cmap='gray')
plt.title('Original Image')
plt.axis('off')

plt.subplot(1, 2, 2)
plt.imshow(edges, cmap='gray')
plt.title('Canny Edge Detection')
plt.axis('off')

plt.show()

圖像分割(Image Segmentation)#

圖像分割是將圖像分成若干個區域,使得每個區域內的像素在某些特徵上具有一致性。圖像分割的目的是將圖像中的物體或感興趣區域從背景中提取出來,常用於物體識別、醫學影像分析、場景理解等領域。

常見的圖像分割方法#

  1. 閾值分割(Thresholding) 閾值分割是一種簡單而有效的分割方法。基本思想是根據像素強度將圖像分為前景和背景。根據設定的閾值,將圖像中大於閾值的像素歸為前景,其他像素歸為背景。

  2. 全局閾值分割:將整張圖像使用單一的閾值進行分割。

  3. 自適應閾值分割:根據圖像的局部區域自動選擇閾值。

  4. 區域增長(Region Growing) 區域增長方法從一個種子像素開始,將相鄰的相似像素(根據某種相似性度量)擴展進來,直到達到某個停止條件。這樣可以有效地分割出相似區域。

  5. 分水嶺算法(Watershed Algorithm) 分水嶺算法是一種基於拓撲結構的分割方法。它將圖像看作是地形,並將其視為“水域”,然後模擬水從低處流向高處的過程來分割圖像。分水嶺算法通常用於處理複雜的圖像分割任務。

  6. K-means聚類 K-means是一種基於聚類的分割方法。它將圖像的像素分成K個類別,每個像素被分配到與其最近的質心所對應的類別中。這種方法適合用於處理顏色或亮度較為均勻的區域。

  7. 語義分割(Semantic Segmentation) 語義分割是深度學習中的一個領域,通過神經網絡(如U-Net、FCN)將圖像分割為多個區域,並且每個區域都有語義上的意圖(例如,區分圖像中的“人”和“車”)。

Python 範例:使用 OpenCV 進行圖像閾值分割#

import cv2
import matplotlib.pyplot as plt

# 讀取圖像
image = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)

# 使用 Otsu 自適應閾值分割
ret, thresh_image = cv2.threshold(image, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)

# 顯示結果
plt.figure(figsize=(10, 5))
plt.subplot(1, 2, 1)
plt.imshow(image, cmap='gray')
plt.title('Original Image')
plt.axis('off')

plt.subplot(1, 2, 2)
plt.imshow(thresh_image, cmap='gray')
plt.title('Thresholded Image (Otsu)')
plt.axis('off')

plt.show()

結論#

邊緣檢測與分割技術是圖像處理和計算機視覺中的基礎工具,能夠有效提取圖像中的結構信息和區域信息。邊緣檢測方法(如Sobel、Canny等)主要用於檢測物體的邊界,而圖像分割方法(如閾值分割、區域增長、分水嶺算法等)則用於將圖像分割成有意義的區域。這些技術被廣泛應用於物體識別、醫學影像分析、場景理解等領域。