2012-06-26 24 views
5

Tôi đang cố sử dụng Zhang-Suen thinning algorithm. Tôi đã cố gắng thực hiện nó trong Java. Nhưng vấn đề là nó tìm thấy tôi cạnh không phải là một chiều rộng một pixel. Lần đầu tiên tôi đang sử dụng thuật toán này và tôi không biết những gì là sai với logic của tôi.Thực hiện thuật toán mỏng Zhang-Suen không hoạt động như mong đợi

Những gì tôi muốn đạt được là:

enter image description here

gì tôi có thể đạt được là:

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(); 
    } 

} 

đâu là lỗi trong logic của tôi đó gây ra tôi để có được kết quả không chính xác?

+2

Câu hỏi của bạn là gì? – tskuzzy

+0

Như tôi đã nghiên cứu, nó sẽ làm mỏng các ký tự thành một dòng. Ý tôi là, mỗi ký tự phải bao gồm một đường rộng như trong hình thứ hai. Nhưng nó đang tìm kiếm như là khung của các chữ cái. Tôi chỉ cần như trong hình ảnh thứ hai. – Ecrin

Trả lời

1

Tôi nghĩ rằng liên kết bạn đang sử dụng cho mô tả thuật toán ZS là sai. Một yêu cầu cần thiết cho việc xóa một điểm ảnh tiền cảnh là số ngang số của nó là 1. Số "qua" là số lần pixel nền trước thay đổi thành pixel nền khi bạn đi qua 8 pixel lân cận theo thứ tự chiều kim đồng hồ. Điều này dường như bị thiếu trong mô tả trong liên kết của bạn. Xem: http://www.uel.br/pessoal/josealexandre/stuff/thinning/ftp/lam-lee-survey.pdf để có cuộc thảo luận tốt hơn.

1

Tuyên bố

connectivity = 0; 

nên được đặt bên trong hai cho vòng trong từng phương pháp.

1

Bạn phải lặp lại cho đến khi không còn thay đổi nào để thực hiện cho bitmap. Bạn chỉ thực hiện một lần lặp lại thuật toán.

Các vấn đề liên quan