2012-07-07 44 views
5

Quería probar mi reconocimiento de texto, así que he usado opencv para trazar los bordes y C++ para encontrar pendientes, curvas, etc., el algoritmo Edge funciona bien en conjuntos grandes y despejados de caracteres, pero cuando se trata de texto pequeño impreso o texto con mucho ruido de fondo, como incrustado en captcha, tiene problemas y parece incompleto, supongo que no había establecido correctamente los valores de umbral y probado diferentes valores sin éxito.Ajustando el umbral en el algoritmo Canny Edge

enter image description here

enter image description here

Aquí está mi código:

#include "cv.h" 
#include "highgui.h" 
using namespace cv; 
const int low_threshold = 50; 
const int high_threshold = 150; 


int main() 
{ 

    IplImage* newImg; 
    IplImage* grayImg; 
    IplImage* cannyImg; 

    newImg = cvLoadImage("ocv.bmp",1); 

    grayImg = cvCreateImage(cvSize(newImg->width, newImg->height), IPL_DEPTH_8U, 1); 

    cvCvtColor(newImg, grayImg, CV_BGR2GRAY); 
    cannyImg = cvCreateImage(cvGetSize(newImg), IPL_DEPTH_8U, 1); 

    cvCanny(grayImg, cannyImg, low_threshold, high_threshold, 3); 
    cvNamedWindow ("Source", 1); 
    cvNamedWindow ("Destination",1); 
    cvShowImage  ("Source", newImg); 
    cvShowImage  ("Destination", cannyImg); 
    cvWaitKey(0); 
    cvDestroyWindow ("Source"); 
    cvDestroyWindow ("Destination"); 
    cvReleaseImage (&newImg); 
    cvReleaseImage (&grayImg); 
    cvReleaseImage (&cannyImg); 

return 0; 

} 

He mirado a través de la red y he visto algunas condiciones de umbral complicadas como en el código de este sitio:

% Set direction to either 0, 45, -45 or 90 depending on angle. 
[x,y]=size(f1); 
for i=1:x-1, 
    for j=1:y-1, 
     if ((gradAngle(i,j)>67.5 && gradAngle(i,j)<=90) || (gradAngle(i,j)>=-90 && gradAngle(i,j)<=-67.5)) 
      gradDirection(i,j)=0; 
     elseif ((gradAngle(i,j)>22.5 && gradAngle(i,j)<=67.5)) 
      gradDirection(i,j)=45; 
     elseif ((gradAngle(i,j)>-22.5 && gradAngle(i,j)<=22.5)) 
      gradDirection(i,j)=90; 
     elseif ((gradAngle(i,j)>-67.5 && gradAngle(i,j)<=-22.5)) 
      gradDirection(i,j)=-45; 
     end 
    end 
end 

Si esto es t La solución puede alguien proporcionarme el equivalente C++ de este algoritmo, si no es así, ¿qué más puedo hacer?

Respuesta

5

Canny Edge Detector es un detector de pasos múltiples que utiliza el umbral de histéresis (utiliza dos umbrales en lugar de uno) y el seguimiento de bordes (el último fragmento es la parte de este paso). Sugiero leer primero la entrada wikipedia. Una posible solución podría ser elegir el umbral alto, por ejemplo, El 70% de los píxeles de la imagen se clasificarán como bordes (inicialmente, puede hacerlo rápidamente usando histogramas), que elegir el umbral bajo como, p. Ej. 40% del umbral alto. Puede ser una buena idea tratar de realizar la detección de bordes en el bloque de imágenes en lugar de la imagen completa, por lo que su algoritmo podría calcular diferentes umbrales para diferentes áreas.

Tenga en cuenta que los CAPTCHA-s están diseñados para ser difíciles de segmentar, y agregar ruido que rompe la detección de bordes es una técnica para lograr esto (es posible que deba suavizar la imagen primero).

+0

No he usado openCV, pero también podría jugar primero con el parámetro sigma del detector de bordes astutos. – WebMonster

+0

Tendría que calcular estos valores a partir del histograma de la imagen de magnitud de gradiente, ¿verdad? –

Cuestiones relacionadas