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)
Odpowiedz
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.
Bardzo dziękuję, znowu – pylover
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
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
@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
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
Jeśli szukasz wersji papierowej, możesz dodać link do tego artykułu lub przynajmniej podać link do tego, co jest SWT. –
może być przydatny: http://stackoverflow.com/questions/4837124/stroke-width-transform-swt-implementation-java-c –
Już je widziałem, ale link był zepsuty i nie ma kodu ani kodu psudo . – pylover