Pregunta Implementación de transformación de ancho de carrera (SWT) (Python)


¿Alguien puede describir cómo puedo implementar SWT en python usando opencv o simplecv?


16
2018-06-20 09:06


origen


Respuestas:


Ok, aquí va:

El enlace que contiene detalles sobre la implementación con el enlace de descarga de código en la parte inferior: SWT

En aras de la exhaustividad, también mencionó que SWT o Stroke Width Transform fue ideado por Epshtein y otros en 2010 y se ha convertido en 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 usa C ++, OpenCV y el Aumentar biblioteca 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.


15
2018-06-21 16:08



Implementé algo similar a la SWT basada en la transformación de distancia descrita en 'ROBUSTA DETECCIÓN DE TEXTO EN IMÁGENES NATURALES CON REGIONES EXTREMALES MÁXIMAMENTE ESTABLES MEJORADAS EN LOS BORDES 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

8
2017-08-03 15:03