Qualcuno può descrivere come posso implementare SWT in python usando opencv o simplecv?Implementazione trasformazione larghezza traccia (SWT) (Python)
risposta
Ok quindi ecco qui:
Il legame che ha dettagli sulla realizzazione con il link codice per il download in basso: SWT
Per ragioni di completezza, anche ricordare che SWT o Stroke Width Transform è stato ideato da Epshtein e altri nel 2010 e si è rivelato uno dei metodi di rilevamento del testo di maggior successo fino alla data. Non utilizza l'apprendimento automatico o test elaborati. Fondamentalmente dopo il rilevamento del bordo Canny sull'immagine di input, calcola lo spessore di ogni tratto che compone gli oggetti nell'immagine. Poiché il testo ha tratti uniformemente spessi, questa può essere una robusta funzionalità di identificazione.
L'implementazione fornita nel collegamento utilizza C++, OpenCV e la libreria Boost da utilizzare per gli attraversamenti grafici ecc. Dopo che il passaggio SWT è stato calcolato. Personalmente l'ho provato su Ubuntu e funziona abbastanza bene (e in modo efficiente), anche se la precisione non è esatta.
Grazie mille, di nuovo – pylover
ho implementato qualcosa di simile alla distanza trasformare la SWT base descritto nel 'ROBUSTO RILEVAMENTO TESTO IN immagini naturali con bordo-ENHANCED REGIONI Extremal massimo STABILI da Huizhong Chen, Sam S. Tsai, Georg Schroth, David M. Chen, Radek Grzeszczuk, Bernd Girod '.
Non è lo stesso descritto nel documento, ma un'approssimazione approssimativa che è servita al mio scopo. Ho pensato che dovrei condividerlo in modo che qualcuno possa trovarlo utile (e segnalare eventuali errori/miglioramenti). È implementato in C++ e utilizza OpenCV.
// bw8u : we want to calculate the SWT of this. NOTE: Its background pixels are 0 and forground pixels are 1 (not 255!)
Mat bw32f, swt32f, kernel;
double min, max;
int strokeRadius;
bw8u.convertTo(bw32f, CV_32F); // format conversion for multiplication
distanceTransform(bw8u, swt32f, CV_DIST_L2, 5); // distance transform
minMaxLoc(swt32f, NULL, &max); // find max
strokeRadius = (int)ceil(max); // half the max stroke width
kernel = getStructuringElement(MORPH_RECT, Size(3, 3)); // 3x3 kernel used to select 8-connected neighbors
for (int j = 0; j < strokeRadius; j++)
{
dilate(swt32f, swt32f, kernel); // assign the max in 3x3 neighborhood to each center pixel
swt32f = swt32f.mul(bw32f); // apply mask to restore original shape and to avoid unnecessary max propogation
}
// swt32f : resulting SWT image
I massimi locali della trasformazione della distanza producono la larghezza della mezza corsa. Questa è una bella osservazione, anche se alcuni documenti nel 2011-2012 hanno usato questa cosa esatta in combinazione con rivelatori di regioni come MSER. – AruniRC
@AruniRC La carta nel collegamento fornito fornisce dettagli su questo metodo. In realtà questa cosa a mezza larghezza non è la mia osservazione. Davvero dispiaciuto se la mia scrittura fa sembrare che sia mio. Tutto il merito di questo dovrebbe andare agli autori di questo articolo. – dhanushka
Oh, non intendevo affatto così. Solo un'osservazione E scusa, colpa mia se non ho visto il link della carta ICIP in precedenza. In effetti, usare la trasformazione a distanza per ottenere la mezza larghezza è molto più facile ed elegante per quanto riguarda l'implementazione. Personalmente, avevo usato un operatore laplaciano per ottenere l'estremo locale di dist. trans. immagine, ma il tuo modo di dilatare è più pulito. – AruniRC
se si sta cercando un'implementazione cartacea, è possibile aggiungere un collegamento a tale documento o almeno fornire un collegamento a ciò che è SWT. –
potrebbe essere utile: http://stackoverflow.com/questions/4837124/stroke-width-transform-swt-implementation-java-c –
li ho già visti, ma il collegamento è stato interrotto e non sono disponibili codice o codice psudo . – pylover