2012-06-20 11 views
16

¿Alguien puede describir cómo puedo implementar SWT en python usando opencv o simplecv?Implementación de transformación de ancho de trazo (SWT) (Python)

+1

si está buscando una implementación en papel, puede agregar un enlace a ese documento, o al menos proporcionar un enlace a lo que es SWT. –

+0

puede ser útil: http://stackoverflow.com/questions/4837124/stroke-width-transform-swt-implementation-java-c –

+0

ya los vi, pero el enlace estaba roto, y no hay ningún código o código psudo disponible . – pylover

Respuesta

15

Ok, así que aquí va:

El vínculo que tiene detalles sobre la aplicación con el enlace de código de descarga en la parte inferior: SWT

En aras de la exhaustividad, también mencionar que SWT o accidente cerebrovascular Ancho Transform se ideado por Epshtein y otros en 2010 y ha resultado ser uno de los métodos de detección de texto más exitosos hasta la fecha. No utiliza aprendizaje automático o pruebas elaboradas. Básicamente después de la detección de bordes Canny en la imagen de entrada, calcula el grosor de cada trazo que compone los objetos en la imagen. Como el texto tiene trazos uniformemente gruesos, esta puede ser una característica de identificación sólida.

La implementación dada en el enlace utiliza C++, OpenCV y la biblioteca Boost que utilizan para los recorridos de gráfico conectados, etc. después de calcular el paso SWT. Personalmente lo probé en Ubuntu y funciona bastante bien (y de manera eficiente), aunque la precisión no es exacta.

+0

Muchas gracias, de nuevo – pylover

8

he implementado algo similar a la distancia transformar SWT basada describe en 'DETECCIÓN DE TEXTO robusto en imágenes naturales con las regiones Extremal LA MÁXIMA ESTABLE EDGE-MEJORADA por Huizhong Chen, Sam S. Tsai, Georg Schroth, David M. Chen, Radek Grzeszczuk, Bernd Girod '.

No es lo mismo que se describe en el documento, pero una aproximación aproximada que sirvió para mi propósito. Pensé que debería compartirlo para que alguien lo encuentre útil (y señalar cualquier error/mejora). Se implementa en C++ y utiliza 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

Los máximos locales de la Transformación de distancia producirán el ancho de la mitad de la carrera. Esa es una buena observación, aunque algunos documentos en 2011-2012 usaron esto exactamente en combinación con detectores regionales como MSER. – AruniRC

+1

@AruniRC El papel en el enlace proporcionado proporciona detalles sobre este método. En realidad, esta mitad de ancho de carrera no es mi observación. Realmente lo siento si mi escritura hace que parezca que es mío. Todo el crédito de esto debería ir a los autores de este documento. – dhanushka

+1

Oh, no quise decir eso de ninguna manera. Solo una observación. Y lo siento, es mi culpa por no haber visto el enlace impreso del ICIP anteriormente. De hecho, usar la transformación de distancia para obtener el ancho medio es mucho más fácil y elegante en términos de implementación. Personalmente, había usado un operador laplaciano para obtener los extremos locales de dist. trans. imagen, pero tu forma de dilatar es más limpia. – AruniRC

Cuestiones relacionadas