2012-06-20 14 views
16

Czy ktoś może opisać, w jaki sposób mogę zaimplementować SWT w pythonie za pomocą opencv lub simplecv?Implementacja transformacji szerokości obrysu (Python)

+1

Jeśli szukasz wersji papierowej, możesz dodać link do tego artykułu lub przynajmniej podać link do tego, co jest SWT. –

+0

może być przydatny: http://stackoverflow.com/questions/4837124/stroke-width-transform-swt-implementation-java-c –

+0

Już je widziałem, ale link był zepsuty i nie ma kodu ani kodu psudo . – pylover

Odpowiedz

15

Ok, więc tutaj idzie:

link, który posiada dane na temat realizacji z linkiem kod pobrania na dole: SWT

Dla kompletności, również wspomnieć, że SWT lub kreski Transform został opracowany przez Ephestein i innych w 2010 roku i okazał się jednym z najbardziej udanych metod wykrywania tekstu aż do daty. Nie używa uczenia maszynowego ani skomplikowanych testów. Zasadniczo po wykryciu krawędzi Canny na obrazie wejściowym oblicza grubość każdego obrysu, który tworzy obiekty na obrazie. Ponieważ tekst ma równomiernie grube pociągnięcia, może to być silną cechą identyfikującą.

Implementacja podana w odnośniku to użycie C++, OpenCV i biblioteki Boost, której używają do podłączonych przebiegów wykresu itp. Po obliczeniu kroku SWT. Osobiście testowałem to na Ubuntu i działa całkiem dobrze (i wydajnie), choć dokładność nie jest dokładna.

+0

Bardzo dziękuję, znowu – pylover

8

I wdrożone coś podobnego do odległości przekształcić SWT oparte opisaną w 'ROBUST TEKSTU wykryciu w naturalny obraz z krawędzią podwyższonym maksymalnie stabilnych regionów ekstremalna przez Huizhong Chen, Sam S. Tsai, Georg Schrotha, David M. Chen, Radek Grzeszczuk, Bernd Girod ".

To nie jest to samo, co opisano w artykule, ale przybliżone przybliżenie, które służyło mojemu celowi. Pomyślałem, że powinienem się nim podzielić, aby ktoś mógł uznać to za użyteczne (i wskazać wszelkie błędy/usprawnienia). Jest zaimplementowany w C++ i używa 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

Lokalne maksima transformacji odległości dają szerokość połowy wyskoku. To miła obserwacja, chociaż niektóre artykuły w latach 2011-2012 wykorzystywały tę dokładną rzecz w połączeniu z detektorami regionu, takimi jak MSER. – AruniRC

+1

@AruniRC Artykuł w danym linku zawiera szczegółowe informacje na temat tej metody. W rzeczywistości ta rzecz o połowie szerokości nie jest moją obserwacją. Naprawdę przepraszam, jeśli moje pismo sprawia, że ​​wygląda tak, jakby było moje. Całość tego należy się autorom niniejszego artykułu. – dhanushka

+1

Och, nie miałem na myśli tego w ten sposób. Tylko obserwacja. I przepraszam, moja wina, że ​​wcześniej nie widziałem linku papierowego ICIP. W rzeczywistości użycie transformacji odległościowej w celu uzyskania połowy szerokości jest o wiele łatwiejsze i eleganckie pod względem implementacji. Osobiście użyłem operatora Laplacian, aby uzyskać lokalny ekstrema dist. trans. obraz, ale twój sposób rozszerzania jest czystszy. – AruniRC

Powiązane problemy