Cum se creează segmentarea imaginii cu SVM: Ghid pas cu pas

Publicat: 2024-12-05

Segmentarea imaginii este o sarcină esențială în viziunea computerizată, unde o imagine este împărțită în regiuni sau segmente care împărtășesc atribute comune, cum ar fi culoarea, textura sau intensitatea. Acest proces de segmentare este util în diferite domenii, inclusiv imagistica medicală, detectarea obiectelor și analiza imaginilor din satelit. Unul dintre instrumentele puternice pentru segmentarea imaginilor este Support Vector Machine (SVM). În acest ghid pas cu pas, vă vom ghida prin cum să creați un model de segmentare a imaginii folosind SVM.

Ce este Support Vector Machine (SVM)?

Support Vector Machines (SVM) sunt algoritmi de învățare automată supravegheați utilizați în mod obișnuit pentru sarcini de clasificare și regresie. În segmentarea imaginii, SVM poate clasifica fiecare pixel al unei imagini în diferite clase (de exemplu, prim-plan, fundal sau obiecte diferite) pe baza caracteristicilor pixelilor cum ar fi culoarea, intensitatea sau textura.

SVM funcționează prin găsirea unui hiperplan optim care maximizează marja dintre diferitele clase. În cazul segmentării imaginii, scopul este de a clasifica fiecare pixel dintr-o imagine într-una dintre categoriile predefinite folosind un clasificator SVM antrenat.

Pasul 1: importați bibliotecile necesare

Mai întâi, să setăm mediul și să importăm bibliotecile necesare. Vom folosi Python cu biblioteci populare precum 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

Pasul 2: Încărcați imaginea

Înțelegerea casetei de selectare a problemei care nu se afișează

Primul pas în procesul de segmentare este să încărcați imaginea pe care doriți să o segmentați. Puteți folosi OpenCV pentru a încărca imaginea și a o converti în formatul adecvat pentru segmentare.

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

Preprocesare (Opțional)

În unele cazuri, este benefic să aplicați unele tehnici de preprocesare pentru a îmbunătăți imaginea înainte de segmentare. Pașii obișnuiți de preprocesare includ netezirea, reducerea zgomotului și egalizarea histogramei.

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

Pasul 3: Extragerea caracteristicilor

În segmentarea imaginii bazată pe SVM, următoarea sarcină este extragerea caracteristicilor relevante din imagine care pot fi folosite pentru a clasifica fiecare pixel. Caracteristicile comune includ intensitatea pixelilor, textura și histogramele de culoare. Pentru simplitate, vom începe cu intensitatea pixelilor ca caracteristică.

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

Pentru imagini color, poate doriți să utilizați histograme de culoare (valori RGB sau HSV) sau funcții mai avansate, cum ar fi modelele binare locale (LBP) pentru textură.

Pasul 4: Definiți etichetele

Pentru învățarea supravegheată, avem nevoie de date etichetate. De obicei, în segmentarea imaginii, aceasta implică etichetarea fiecărui pixel din imagine. Puteți eticheta manual un subset al imaginii sau puteți utiliza un adevăr de bază existent (dacă este disponibil). Etichetele pot fi binare (prim-plan vs. fundal) sau multiclase (mai multe obiecte).

Pentru simplitate, să presupunem că avem pixeli etichetați manual:

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

Dacă aveți etichete de adevăr de bază sub forma unei imagini, le puteți utiliza direct.

Pasul 5: Antrenați clasificatorul SVM

Odată ce aveți caracteristicile și etichetele, următorul pas este să împărțiți datele în seturi de antrenament și testare și să antrenați clasificatorul 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)

Pasul 6: Evaluarea modelului

După antrenamentul modelului, este esențial să-i evaluăm performanța folosind setul de testare. Acest lucru vă va ajuta să evaluați capacitatea clasificatorului de a segmenta corect imaginea.

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

Pasul 7: Aplicați modelul SVM instruit pentru segmentare

Odată ce clasificatorul SVM este antrenat și evaluat, îl putem folosi pentru a prezice etichetele pentru fiecare pixel din imaginea originală și pentru a genera imaginea segmentată.

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

Imaginea segmentată va afișa diferite regiuni ale imaginii pe baza clasificării SVM. Puteți vizualiza rezultatul segmentării, unde fiecare clasă este de obicei reprezentată printr-o culoare sau o etichetă unică.

Pasul 8: Post-procesare (Opțional)

În unele cazuri, tehnicile de post-procesare, cum ar fi operațiile morfologice (de exemplu, eroziunea, dilatarea) pot ajuta la curățarea regiunilor segmentate și la îndepărtarea artefactelor mici.

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

Concluzie

Utilizarea SVM pentru segmentarea imaginii oferă o modalitate eficientă de clasificare a pixelilor imaginii în diferite categorii. Urmând acești pași - de la încărcarea imaginii până la aplicarea modelului SVM antrenat pentru segmentare - puteți segmenta imaginile pe baza caracteristicilor pixelilor. În timp ce acest ghid a folosit funcții de bază de intensitate în tonuri de gri, puteți îmbunătăți performanța prin încorporarea unor caracteristici mai sofisticate, cum ar fi histogramele de culoare, textura sau metodele bazate pe învățare profundă pentru extragerea caracteristicilor.

Metoda SVM pentru segmentarea imaginii este versatilă și poate fi aplicată într-o varietate de cazuri de utilizare, inclusiv imagistica medicală, conducerea autonomă și analiza imaginilor prin satelit, oferind rezultate de segmentare precise și eficiente.