2012-06-20 2 views
16

Kann jemand beschreiben, wie kann ich SWT in Python mit opencv oder simplecv implementieren?Stroke Width Transform (SWT) Implementierung (Python)

+1

Wenn Sie nach einer Papierimplementierung suchen, können Sie einen Link zu diesem Papier hinzufügen oder zumindest einen Link zu SWT bereitstellen. –

+0

kann nützlich sein: http://stackoverflow.com/questions/4837124/stroke-width-transform-swt-implementation-java-c –

+0

Ich sah sie bereits, aber die Verbindung war kaputt, und kein Code oder psudo-Code sind verfügbar . – pylover

Antwort

15

Ok, so hier geht:

Der Link, der an der Unterseite Details über die Umsetzung mit dem Code Download-Link hat: Es wurde SWT

Aus Gründen der Vollständigkeit, auch zu erwähnen, dass SWT oder Stroke Width-Transformation von Epshtein und anderen im Jahr 2010 entwickelt und hat sich bis heute zu einer der erfolgreichsten Methoden zur Texterkennung entwickelt. Es verwendet kein maschinelles Lernen oder aufwendige Tests. Grundsätzlich wird nach der Canny-Kantendetektion auf dem Eingabebild die Dicke jedes Strichs berechnet, aus dem Objekte im Bild bestehen. Da Text gleichmäßig dicke Striche hat, kann dies ein robustes Erkennungsmerkmal sein.

Die in der Verknüpfung angegebene Implementierung verwendet C++, OpenCV und die Boost-Bibliothek, die sie für die verbundenen Graph-Traversalen usw. verwenden, nachdem der SWT-Schritt berechnet wurde. Persönlich habe ich es auf Ubuntu getestet und es funktioniert ziemlich gut (und effizient), obwohl die Genauigkeit nicht genau ist.

+0

Vielen Dank nochmal – pylover

8

ich etwas Ähnliches wie die Entfernung implementiert basierend SWT in 'ROBUST TEXT NACHWEIS IN NATURAL Bilder mit EDGE-enhanced maximal STABLE Extremal REGION von Huizhong Chen, Sam S. Tsai, Georg Schroth, David M. beschrieben verwandeln Chen, Radek Grzeszczuk, Bernd Girod '.

Es ist nicht das gleiche wie im Papier beschrieben, aber eine grobe Annäherung, die meinem Zweck diente. Ich dachte, ich sollte es teilen, damit jemand es nützlich finden kann (und auf Fehler/Verbesserungen hinweisen). Es ist in C++ implementiert und verwendet 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

Die lokalen Maxima der Entfernungstransformation ergeben die Halbwertsbreite. Das ist eine nette Beobachtung, obwohl einige Arbeiten in den Jahren 2011-2012 genau dieses Ding in Kombination mit Regionendetektoren wie MSERs verwendet haben. – AruniRC

+1

@AruniRC Das Papier in dem angegebenen Link enthält Details zu dieser Methode. Eigentlich ist dieses halbe Strichbreite-Ding nicht meine Beobachtung. Tut mir wirklich leid, wenn mein Schreiben es so aussehen lässt, dass es mir gehört. All dies sollte den Autoren dieses Artikels zugute kommen. – dhanushka

+1

Oh, ich meinte das überhaupt nicht so. Nur eine Beobachtung. Und es tut mir leid, mein Fehler, dass ich den ICIP-Link zuvor nicht gesehen habe. In der Tat ist die Verwendung der Distanz-Transformation, um die Halbwertsbreite zu erhalten, viel einfacher und eleganter Implementierung. Persönlich hatte ich einen Laplaceoperator benutzt, um die lokalen Extrema von dist zu bekommen. trans. Bild, aber Ihre Art zu erweitern ist sauberer. – AruniRC