如何使用 SVM 建立影像分割:逐步指南

已發表: 2024-12-05

影像分割是電腦視覺中的一項基本任務,其中影像被劃分為具有共同屬性(例如顏色、紋理或強度)的區域或片段。這種分割過程在各個領域都很有用,包括醫學影像、物體偵測和衛星影像分析。支援向量機 (SVM) 是影像分割的強大工具之一。在本逐步指南中,我們將引導您了解如何使用 SVM 建立影像分割模型。

什麼是支援向量機(SVM)?

支援向量機 (SVM) 是常用於分類和迴歸任務的監督式機器學習演算法。在影像分割中,SVM 可以根據顏色、強度或紋理等像素特徵將影像的每個像素分類為不同的類別(例如前景、背景或不同的物件)。

SVM 的工作原理是找到一個最佳超平面,使不同類別之間的間隔最大化。在影像分割的情況下,目標是使用經過訓練的 SVM 分類器將影像中的每個像素分類到預先定義的類別之一。

第 1 步:導入所需的庫

首先,我們來設定環境並導入必要的庫。我們將使用 Python 和 OpenCV、Scikit-learn 和 NumPy 等流行函式庫。

 import cv2 import numpy as np from sklearn import svm from sklearn.model_selection import train_test_split from sklearn.metrics import classification_report, accuracy_score

第 2 步:載入圖像

了解複選框未顯示的問題

分割過程的第一步是載入要分割的圖像。您可以使用 OpenCV 載入映像並將其轉換為適當的格式以進行分割。

 # Load the image image = cv2.imread('your_image.jpg') # Convert to grayscale for simplicity (you can also work with color channels if needed) gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

預處理(可選)

在某些情況下,在分割之前應用一些預處理技術來增強影像是有益的。常見的預處理步驟包括平滑、降噪和直方圖均衡。

 # Optional: Apply GaussianBlur to reduce noise blurred_image = cv2.GaussianBlur(gray_image, (5, 5), 0)

第三步:特徵提取

在基於支援向量機的影像分割中,下一個任務是從影像中提取可用於對每個像素進行分類的相關特徵。常見特徵包括像素強度、紋理和顏色直方圖。為簡單起見,我們將從像素強度作為特徵開始。

 # Flatten the image to create a feature vector for each pixel features = gray_image.flatten() # Using grayscale intensity as a feature

對於彩色影像,您可能需要使用顏色直方圖(RGB 或 HSV 值),或更高級的功能,例如用於紋理的局部二進位模式 (LBP)。

第 4 步:定義標籤

對於監督學習,我們需要標記數據。通常,在影像分割中,這涉及標記影像中的每個像素。您可以手動標記影像的子集或使用現有的基本事實(如果可用)。標籤可以是二元的(前景與背景)或多類(多個物件)。

為了簡單起見,我們假設我們已經手動標記了像素:

 # Manually define labels (0 for background, 1 for object) labels = np.array([0, 1, 1, 0, 1, 0]) # Example, label values for each pixel

如果您有圖像形式的真實標籤,則可以直接使用它們。

第 5 步:訓練 SVM 分類器

獲得特徵和標籤後,下一步是將資料拆分為訓練集和測試集,並訓練 SVM 分類器。

 # Split the data into training and testing sets X_train, X_test, y_train, y_test = train_test_split(features, labels, test_size=0.2, random_state=42) # Initialize the SVM classifier (using a linear kernel as an example) svm_classifier = svm.SVC(kernel='linear') # Train the SVM model svm_classifier.fit(X_train.reshape(-1, 1), y_train)

第6步:模型評估

訓練模型後,使用測試集評估其性能至關重要。這將幫助您評估分類器正確分割影像的能力。

 # Predict using the test set y_pred = svm_classifier.predict(X_test.reshape(-1, 1)) # Evaluate the classifier performance print(classification_report(y_test, y_pred)) print(f'Accuracy: {accuracy_score(y_test, y_pred)}')

步驟7:應用訓練好的SVM模型進行分割

一旦 SVM 分類器經過訓練和評估,我們就可以用它來預測原始影像中每個像素的標籤並產生分割影像。

 # Predict labels for the entire image segmented_image = svm_classifier.predict(features.reshape(-1, 1)) # Reshape the result back to the original image shape segmented_image = segmented_image.reshape(gray_image.shape) # Display the segmented image cv2.imshow('Segmented Image', segmented_image) cv2.waitKey(0) cv2.destroyAllWindows()

分割後的影像將根據SVM的分類顯示影像的不同區域。您可以視覺化分割結果,其中每個類別通常由唯一的顏色或標籤表示。

第 8 步:後處理(可選)

在某些情況下,形態學操作(例如,腐蝕、膨脹)等後處理技術可以幫助清理分割區域並去除小偽影。

 # Apply morphological operations to improve segmentation (optional) kernel = np.ones((5, 5), np.uint8) segmented_image = cv2.dilate(segmented_image, kernel, iterations=1) segmented_image = cv2.erode(segmented_image, kernel, iterations=1) # Display final segmented image cv2.imshow('Final Segmented Image', segmented_image) cv2.waitKey(0) cv2.destroyAllWindows()

結論

使用SVM進行影像分割提供了一種將影像像素分類為不同類別的有效方法。透過執行以下步驟(從載入影像到套用經過訓練的 SVM 模型進行分割),您可以根據像素特徵分割影像。雖然本指南使用了基本的灰階強度特徵,但您可以透過合併更複雜的特徵(例如顏色直方圖、紋理或基於深度學習的特徵提取方法)來提高性能。

用於影像分割的SVM方法用途廣泛,可應用於多種用例,包括醫學成像、自動駕駛和衛星影像分析,提供準確、高效的分割結果。