vorrei spiegare un semplice codice su come utilizzare spartiacque qui. Sto usando OpenCV-Python, ma spero tu non abbia alcuna difficoltà a capire.
In questo codice, userò lo spartiacque come strumento per l'estrazione in primo piano di . (Questo esempio è la controparte python del codice C++ nel ricettario OpenCV). Questo è un caso semplice per capire lo spartiacque. Oltre a questo, puoi usare lo spartiacque per contare il numero di oggetti in questa immagine. Questa sarà una versione leggermente avanzata di questo codice.
- Prima carichiamo la nostra immagine, la convertiamo in scala di grigi e la soglia con un valore adeguato. Ho preso binarizzazione di Otsu, quindi avrebbe trovato il miglior valore di soglia.
import cv2
import numpy as np
img = cv2.imread('sofwatershed.jpg')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
ret,thresh = cv2.threshold(gray,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
seguenti è il risultato che ho ottenuto:
(anche questo risultato è buono, perché grande contrasto tra sfondo e primo piano le immagini)
2 - Ora dobbiamo creare il marcatore Marker è l'immagine con le stesse dimensioni dell'immagine originale che è 32SC1 (canale singolo con segno a 32 bit).
Ora ci saranno alcune regioni nell'immagine originale in cui sei semplicemente sicuro, quella parte appartiene al primo piano. Contrassegna tale regione con 255 nell'immagine del marcatore. Ora la regione in cui sei sicuro di essere sullo sfondo è contrassegnata da 128. La regione in cui non sei sicuro è contrassegnata con 0. Questo è quanto faremo dopo.
A - Regione primo piano: - Abbiamo già un'immagine di soglia in cui le pillole sono di colore bianco. Li erodiamo un po ', così siamo sicuri che la restante regione sia in primo piano.
fg = cv2.erode(thresh,None,iterations = 2)
fg:
B - Regione Background: - Qui abbiamo dilatare l'immagine in modo che thresholded regione di fondo viene ridotto. Ma siamo sicuri che la restante regione nera sia al 100% di background. Lo impostiamo a 128.
bgt = cv2.dilate(thresh,None,iterations = 3)
ret,bg = cv2.threshold(bgt,1,128,1)
ora otteniamo bg come segue:
C - Ora possiamo aggiungere sia fg e bg:
marker = cv2.add(fg,bg)
Qui di seguito è quello che si ottiene:
Ora possiamo capire chiaramente dall'immagine sopra, che la regione bianca è al 100% in primo piano, la regione grigia è al 100% di sfondo e la regione nera non è sicura.
Poi abbiamo convertirlo in 32SC1:
marker32 = np.int32(marker)
3 - Finalmente siamo applichiamo spartiacque e risultato riconvertire in uint8 immagine:
cv2.watershed(img,marker32)
m = cv2.convertScaleAbs(marker32)
m:
- Abbiamo soglia in modo corretto per ottenere la maschera ed eseguire bitwise_and
l'immagine in ingresso con:
ret,thresh = cv2.threshold(m,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
res = cv2.bitwise_and(img,img,mask = thresh)
res:
Speranza che aiuta! !!
ARK
La risposta dal @mmgp è la soluzione corretta a questa domanda. Sento che dovresti contrassegnarlo come la risposta accettata. –