Jak utworzyć segmentację obrazu za pomocą SVM: przewodnik krok po kroku

Opublikowany: 2024-12-05

Segmentacja obrazu to podstawowe zadanie w wizji komputerowej, gdzie obraz jest dzielony na regiony lub segmenty, które mają wspólne cechy, takie jak kolor, tekstura lub intensywność. Ten proces segmentacji jest przydatny w różnych dziedzinach, w tym w obrazowaniu medycznym, wykrywaniu obiektów i analizie obrazów satelitarnych. Jednym z potężnych narzędzi do segmentacji obrazu jest maszyna wektorów nośnych (SVM). W tym przewodniku krok po kroku przeprowadzimy Cię przez proces tworzenia modelu segmentacji obrazu za pomocą SVM.

Co to jest maszyna wektorów nośnych (SVM)?

Maszyny wektorów nośnych (SVM) to nadzorowane algorytmy uczenia maszynowego powszechnie używane do zadań klasyfikacji i regresji. Podczas segmentacji obrazu SVM może klasyfikować każdy piksel obrazu na różne klasy (np. pierwszy plan, tło lub różne obiekty) w oparciu o cechy pikseli, takie jak kolor, intensywność lub tekstura.

SVM działa poprzez znalezienie optymalnej hiperpłaszczyzny, która maksymalizuje margines pomiędzy różnymi klasami. W przypadku segmentacji obrazu celem jest sklasyfikowanie każdego piksela obrazu w jednej z predefiniowanych kategorii przy użyciu przeszkolonego klasyfikatora SVM.

Krok 1: Zaimportuj wymagane biblioteki

Najpierw skonfigurujmy środowisko i zaimportujmy potrzebne biblioteki. Będziemy używać Pythona z popularnymi bibliotekami, takimi jak OpenCV, Scikit-learn i 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

Krok 2: Załaduj obraz

Znaczenie pola wyboru problemu, które nie jest wyświetlane

Pierwszym krokiem w procesie segmentacji jest załadowanie obrazu, który chcesz segmentować. Możesz użyć OpenCV, aby załadować obraz i przekonwertować go na odpowiedni format w celu segmentacji.

 # 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)

Przetwarzanie wstępne (opcjonalnie)

W niektórych przypadkach korzystne jest zastosowanie technik wstępnego przetwarzania w celu ulepszenia obrazu przed segmentacją. Typowe etapy przetwarzania wstępnego obejmują wygładzanie, redukcję szumów i wyrównywanie histogramu.

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

Krok 3: Ekstrakcja cech

W segmentacji obrazu opartej na SVM kolejnym zadaniem jest wyodrębnienie z obrazu odpowiednich cech, które można wykorzystać do klasyfikacji każdego piksela. Wspólne cechy obejmują intensywność pikseli, teksturę i histogramy kolorów. Dla uproszczenia zaczniemy od intensywności pikseli jako funkcji.

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

W przypadku obrazów kolorowych warto zastosować histogramy kolorów (wartości RGB lub HSV) lub bardziej zaawansowane funkcje, takie jak lokalne wzorce binarne (LBP) dla tekstury.

Krok 4: Zdefiniuj etykiety

Do uczenia nadzorowanego potrzebujemy oznakowanych danych. Zwykle w przypadku segmentacji obrazu obejmuje to oznaczenie każdego piksela obrazu. Możesz ręcznie oznaczyć podzbiór obrazu lub użyć istniejącej podstawy (jeśli jest dostępna). Etykiety mogą być binarne (pierwszy plan lub tło) lub wieloklasowe (wiele obiektów).

Dla uproszczenia załóżmy, że mamy ręcznie oznaczone piksele:

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

Jeśli masz etykiety prawdy w formie obrazu, możesz ich bezpośrednio użyć.

Krok 5: Wytrenuj klasyfikator SVM

Gdy masz już funkcje i etykiety, następnym krokiem jest podzielenie danych na zbiory uczące i testowe oraz wytrenowanie klasyfikatora 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)

Krok 6: Ocena modelu

Po przeszkoleniu modelu kluczowa jest ocena jego wydajności przy użyciu zestawu testowego. Pomoże Ci to ocenić zdolność klasyfikatora do prawidłowej segmentacji obrazu.

 # 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)}')

Krok 7: Zastosuj przeszkolony model SVM do segmentacji

Po wyszkoleniu i ocenie klasyfikatora SVM możemy go użyć do przewidzenia etykiet dla każdego piksela w oryginalnym obrazie i wygenerowania podzielonego na segmenty obrazu.

 # 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()

Segmentowany obraz będzie wyświetlał różne obszary obrazu w oparciu o klasyfikację SVM. Możesz wizualizować wynik segmentacji, gdzie każda klasa jest zazwyczaj reprezentowana przez unikalny kolor lub etykietę.

Krok 8: Przetwarzanie końcowe (opcjonalnie)

W niektórych przypadkach techniki przetwarzania końcowego, takie jak operacje morfologiczne (np. erozja, dylatacja), mogą pomóc w oczyszczeniu podzielonych na segmenty obszarów i usunięciu drobnych artefaktów.

 # 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()

Wniosek

Użycie SVM do segmentacji obrazu zapewnia skuteczny sposób klasyfikowania pikseli obrazu na różne kategorie. Wykonując poniższe kroki — od załadowania obrazu po zastosowanie wytrenowanego modelu SVM do segmentacji — można segmentować obrazy na podstawie cech pikseli. Chociaż w tym przewodniku wykorzystano podstawowe funkcje intensywności skali szarości, można poprawić wydajność, włączając bardziej wyrafinowane funkcje, takie jak histogramy kolorów, tekstury lub metody ekstrakcji cech oparte na głębokim uczeniu.

Metoda SVM do segmentacji obrazu jest wszechstronna i może być stosowana w różnych przypadkach użycia, w tym w obrazowaniu medycznym, autonomicznej jeździe i analizie obrazów satelitarnych, zapewniając dokładne i wydajne wyniki segmentacji.