2012-06-20 18 views
16

Qualcuno può descrivere come posso implementare SWT in python usando opencv o simplecv?Implementazione trasformazione larghezza traccia (SWT) (Python)

+1

se si sta cercando un'implementazione cartacea, è possibile aggiungere un collegamento a tale documento o almeno fornire un collegamento a ciò che è SWT. –

+0

potrebbe essere utile: http://stackoverflow.com/questions/4837124/stroke-width-transform-swt-implementation-java-c –

+0

li ho già visti, ma il collegamento è stato interrotto e non sono disponibili codice o codice psudo . – pylover

risposta

15

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.

+0

Grazie mille, di nuovo – pylover

8

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 
+0

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

+1

@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

+1

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