2012-06-26 8 views
5

Estoy tratando de usar Zhang-Suen thinning algorithm. Intenté implementarlo en Java. Pero el problema es que me encuentra bordes no como una línea de ancho de un píxel. La primera vez estoy usando este algoritmo y no sé qué está mal con mi lógica.La implementación del algoritmo de adelgazamiento Zhang-Suen no funciona como se esperaba

Lo que quiero lograr es:

enter image description here

Lo que soy capaz de lograr es:

enter image description here

public void thinStepI(){ 

    delList.clear(); 
    neighbor = 0; 
    connectivity = 0; 

    for(int i=4;i<width-4;i++) 
     for(int j=4;j<height-4;j++){ 
      p = pixelList[i][j]; 
      if (p == 1){ 
       p1 = pixelList[i-1][j]; 
       p2 = pixelList[i-1][j+1]; 
       p3 = pixelList[i][j+1]; 
       p4 = pixelList[i+1][j+1]; 
       p5 = pixelList[i+1][j]; 
       p6 = pixelList[i+1][j-1]; 
       p7 = pixelList[i][j-1]; 
       p8 = pixelList[i-1][j-1]; 


       neighbor = p1 + p2 + p3 + p4 + p5 + p6 + p7 + p8; 

       if (p1 == 0 && p2 == 1) 
        connectivity ++; 
       if (p2 == 0 && p3 == 1) 
        connectivity ++; 
       if (p3 == 0 && p4 == 1) 
        connectivity ++; 
       if (p4 == 0 && p5 == 1) 
        connectivity ++; 
       if (p5 == 0 && p6 == 1) 
        connectivity ++; 
       if (p6 == 0 && p7 == 1) 
        connectivity ++; 
       if (p7 == 0 && p8 == 1) 
        connectivity ++; 
       if (p8 == 0 && p1 == 1) 
        connectivity ++; 

       if (connectivity == 1 && (neighbor >= 2 && neighbor <= 6) && 
        (p1 * p3 * p5 == 0) && (p3 * p5 * p7 == 0)){ 
        delList.add(i); 
        delList.add(j); 
       } 



      }  
     } 

    int length = delList.size(); 
    if (length != 0){ 
     for(int i =0; i < (length - 1); i+=2){ 
      pixelList[delList.get(i)][delList.get(i+1)] = 0; 
      System.out.println("oldu"); 
     } 
     thinStepI(); 
    } 


} 

    public void thinStepII(){ 
    delList.clear(); 
    neighbor = 0; 
    connectivity = 0; 

    for(int i=4;i<width-4;i++) 
     for(int j=4;j<height-4;j++){ 
      if (pixelList[i][j] == 1){ 
       p = pixelList[i][j]; // ** Origin Pixel ** 
       p1 = pixelList[i-1][j]; 
       p2 = pixelList[i-1][j+1]; 
       p3 = pixelList[i][j+1]; 
       p4 = pixelList[i+1][j+1]; 
       p5 = pixelList[i+1][j]; 
       p6 = pixelList[i+1][j-1]; 
       p7 = pixelList[i][j-1]; 
       p8 = pixelList[i-1][j-1];      

       neighbor = p1 + p2 + p3 + p4 + p5 + p6 + p7 + p8; 

       if (p1 == 0 && p2 == 1) 
        connectivity ++; 
       if (p2 == 0 && p3 == 1) 
        connectivity ++; 
       if (p3 == 0 && p4 == 1) 
        connectivity ++; 
       if (p4 == 0 && p5 == 1) 
        connectivity ++; 
       if (p5 == 0 && p6 == 1) 
        connectivity ++; 
       if (p6 == 0 && p7 == 1) 
        connectivity ++; 
       if (p7 == 0 && p8 == 1) 
        connectivity ++; 
       if (p8 == 0 && p1 == 1) 
        connectivity ++; 

       if (connectivity == 1 && (neighbor >= 2 && neighbor <= 6) && 
        (p1 * p3 * p7 == 0) && (p1 * p5 * p7 == 0)){ 
        delList.add(i); 
        delList.add(j); 
       } 



      }  
     } 

    int length = delList.size(); 
    if (length != 0){ 
     for(int i =0; i < (length - 1); i+=2){ 
      pixelList[delList.get(i)][delList.get(i+1)] = 0; 
      System.out.println("oldu2"); 
     } 
     thinStepII(); 
    } 

} 

¿Dónde está el error en mi lógica que está causando yo para obtener los resultados incorrectos?

+2

¿Cuál es tu pregunta? – tskuzzy

+0

Cuando investigué, debe diluir los caracteres como una sola línea. Quiero decir, cada personaje debe tener una línea de ancho como en la segunda imagen. Pero está encontrando como marco de las letras. Solo necesito como en la segunda imagen. – Ecrin

Respuesta

1

Creo que el enlace que está utilizando para la descripción del algoritmo ZS es incorrecto. Un requisito necesario para eliminar un píxel de primer plano es que cruce número es 1. El "número de cruce" es el número de veces que los píxeles de primer plano cambian a píxeles de fondo al atravesar los 8 píxeles vecinos en el sentido de las agujas del reloj. Esto parece estar ausente de la descripción en su enlace. Ver: http://www.uel.br/pessoal/josealexandre/stuff/thinning/ftp/lam-lee-survey.pdf para una mejor discusión.

1

La declaración

connectivity = 0; 

será colocado dentro de los dos bucles en cada método.

1

Tienes que repetir el ciclo hasta que no queden cambios en el mapa de bits. Solo hizo una iteración del algoritmo.

Cuestiones relacionadas