2012-08-24 3 views
2

나는 많은 연구를했으며 이에 대한 적절한 해결책을 찾지 못했습니다. Android OCR 앱을 프로그래밍하고 있습니다. 성공적으로 Tesseract 및 Leptonica를로드했으며 성공적으로 이미지를 가져 와서 처리하고 있으며 OCR을 사용하여 이미지를 텍스트로 변환합니다. 그러나 인식 정확도가 좋지 않습니다.OCR을위한 이미지 기울기 보정 및 필터링

많이 조정 한 후에 우리는 OCR 처리에서 Tesseract를 지원할만큼 이미지를 필터링, 청소 및/또는 기울기 보정하지 않았 음을 알았습니다. 따라서 인터넷에서 라이브러리 나 코드를 찾아 보았습니다.이 라이브러리 나 코드는 Android에서 사용할 수 없습니다.

누구든지 라이브러리에 대해 알고 있거나이를 수행하는 데 도움이되는 코드를 제공 할 수 있습니까? 내가 원하는 건 비트 맵을 가져 와서 흑백으로 변환하고, 기울이기 및/또는 일부 필터링 작업을 실행하고 그것을 Tesseract에 제공하여 OCR을 사용하여 텍스트로 변환하는 것입니다.

+0

[여기] (https://www.google.com/search?q=android+image+manipulation+library)를 먼저 찾으십시오. –

답변

1

ImageMagick이이를 수행 할 수 있습니다. 명령 줄 :

convert        \ 
    input.{png,pdf,tif,jpeg,gif,...} \ 
    -colorspace grayscale    \ 
    -threshold 50%     \ 
    -deskew       \ 
    output.{png,pdf,tif,jpeg,gif,...} 

-colorspace grayscale : 또한 색의 입력을 처리하는 데 도움이됩니다.
-threshold 50% : 백분율 값으로 재생할 수 있지만 기본적으로는 검은 색 + 흰색으로 만 변환됩니다.
-deskews : 나는 그것이 안드로이드 플랫폼에 대한 ImageMagick를 구축하는 것이 얼마나 쉬운 어렵거나 확실하지 않다, 그러나

를 지연 시간 보정. Linux, Mac OS X, Windows, Solaris, HP-UX 등에서 사용할 수 있습니다. 어쨌든 다중 플랫폼이 가능합니다.

+0

감사합니다 !! 이 라이브러리를 Android로 포팅하고 여기에 게시하려면 어떻게하는지 확인하겠습니다. 또한, 나는이 블로그가 매우 도움이된다는 것을 발견했다 [link] (http://android-coding.blogspot.com/2012/05/image-processing-on-android-step-by.html). 그리고 이것 역시 : [link] (http://xjaphx.wordpress.com/learning/tutorials/). –

+0

@ManuelOrtizBey : 오, 당신은 ** ['-convolve kernel'] (http://www.imagemagick.org/script/command-line-options.php#convolve) **를 사용할 수 있습니다 (* kernel *는 매트릭스) ImageMagick과 같은 종류의 효과도. –

1

내 이미지를 B & W로 변환하는 방법을 사용하여 내 정확성을 크게 높일 수있었습니다.

private Bitmap GetBinaryBitmap(Bitmap bitmap_src) { 
    Bitmap bitmap_new = bitmap_src.copy(bitmap_src.getConfig(), true); 

    for (int x = 0; x < bitmap_new.getWidth(); x++) { 
     for (int y = 0; y < bitmap_new.getHeight(); y++) { 
      int color = bitmap_new.getPixel(x, y); 
      color = GetNewColor(color); 
      bitmap_new.setPixel(x, y, color); 
     } 
    } 

    return bitmap_new; 
} 


private double GetColorDistance(int c1, int c2) { 
    int db = Color.blue(c1) - Color.blue(c2); 
    int dg = Color.green(c1) - Color.green(c2); 
    int dr = Color.red(c1) - Color.red(c2); 

    double d = Math.sqrt(Math.pow(db, 2) + Math.pow(dg, 2) + Math.pow(dr, 2)); 
    return d; 
} 

private int GetNewColor(int c) { 
    double dwhite = GetColorDistance(c, Color.WHITE); 
    double dblack = GetColorDistance(c, Color.BLACK); 

    if (dwhite <= dblack) { 
     return Color.WHITE; 

    } else { 
     return Color.BLACK; 
    } 
} 

희망이 있습니다.

+0

더 좋은 해결책은 캔버스와 컬러 매트릭스를 사용하는 것입니다.이 방법은 소프트웨어 렌더링을 사용하는 위의 방법 대신 하드웨어 렌더링을 사용하므로 결과가 엄청나게 빠를 것입니다. –