使用 tess-two 库从 android 中的 Bitmap 中提取数字 [英] extracting numbers from Bitmap in android using tess-two library

查看:103
本文介绍了使用 tess-two 库从 android 中的 Bitmap 中提取数字的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想从位图中提取一个数字.我正在使用 tess-two 库,但它无法正确识别.

I want to extract a number from a Bitmap. I'm using the tess-two library, but it does not recognize correctly.

示例代码:

    @Override
        public void onClick(View v) {
        switch (v.getId()){
        case R.id.b2:
        InputStream is = null;
        try {
        is = getApplicationContext().getAssets().open("zak.jpeg");
        } catch (IOException e1) {
        e1.printStackTrace();
        }
         final Drawable drw = Drawable.createFromStream(is, null);
         bmp = ((BitmapDrawable) drw).getBitmap();

        TessBaseAPI baseApi = new TessBaseAPI();
           bmp =BITMAP_RESIZER(bmp,bmp.getWidth(),bmp.getHeight());
            bmp =convertToGrayscale(bmp);
             bmp =RemoveNoise(bmp);
             iv.setImageBitmap(bmp);

          baseApi.init("/mnt/sdcard/Download/", "eng");
          baseApi.setVariable(TessBaseAPI.VAR_CHAR_WHITELIST,"1234567890");
          baseApi.setVariable(TessBaseAPI.VAR_CHAR_BLACKLIST,"!@#$%^&*   ()_+=-[]}{" +";:'\"\\|~`,./<>?");
          baseApi.setDebug(true);
         baseApi.setImage(bmp);

        String recognizedText = baseApi.getUTF8Text();
        tv.setText(" numbers : "+recognizedText.trim());
        Log.d("karim", recognizedText);
        baseApi.end();
             break;

Bitmap转灰度的方法:

Method to convert the Bitmap to grayscale:

 public static Bitmap convertToGrayscale(Bitmap bmpOriginal) {
          int width, height;
           height = bmpOriginal.getHeight();
          width = bmpOriginal.getWidth();    

         Bitmap bmpGrayscale = Bitmap.createBitmap(width, height,  Bitmap.Config.ARGB_8888);
         Canvas c = new Canvas(bmpGrayscale);
         Paint paint = new Paint();
         ColorMatrix cm = new ColorMatrix();
         cm.setSaturation(0);
         ColorMatrixColorFilter f = new ColorMatrixColorFilter(cm);
         paint.setColorFilter(f);
         c.drawBitmap(bmpOriginal, 0, 0, paint);
         return bmpGrayscale;
     }

去除Bitmap噪声的方法:

Method to remove the noise from the Bitmap:

  public Bitmap RemoveNoise(Bitmap bmap) {
        for (int x = 0; x < bmap.getWidth(); x++) {
        for (int y = 0; y < bmap.getHeight(); y++) {
        int pixel = bmap.getPixel(x, y);
        int R = Color.red(pixel);
        int G = Color.green(pixel);
        int B = Color.blue(pixel);
        if (R < 162 && G < 162 && B < 162)
        bmap.setPixel(x, y, Color.BLACK);
        }
    }
        for (int  x = 0; x < bmap.getWidth(); x++) {
        for (int y = 0; y < bmap.getHeight(); y++) {
        int pixel = bmap.getPixel(x, y);
        int R = Color.red(pixel);
        int G = Color.green(pixel);
        int B = Color.blue(pixel);
        if (R > 162 && G > 162 && B > 162)
              bmap.setPixel(x, y, Color.WHITE);
        }
    }
       return bmap;
    }

调整位图大小的方法:

   public Bitmap BITMAP_RESIZER(Bitmap bitmap,int newWidth,int newHeight) 
      {    
    Bitmap scaledBitmap = Bitmap.createBitmap(newWidth, newHeight, Config.ARGB_8888);

    float ratioX = newWidth / (float) bitmap.getWidth();
    float ratioY = newHeight / (float) bitmap.getHeight();
    float middleX = newWidth / 2.0f;
    float middleY = newHeight / 2.0f;

    Matrix scaleMatrix = new Matrix();
    scaleMatrix.setScale(ratioX, ratioY, middleX, middleY);

    Canvas canvas = new Canvas(scaledBitmap);
    canvas.setMatrix(scaleMatrix);
    canvas.drawBitmap(bitmap, middleX - bitmap.getWidth() / 2, middleY - bitmap.getHeight() / 2, new Paint(Paint.FILTER_BITMAP_FLAG));

    return scaledBitmap;

    }

我该如何解决这个问题?

How do I fix this problem?

推荐答案

也许这有点晚了,但无论如何,如果我理解正确的话,你想要的只是作为输出的数字.

Maybe this is somewhat late but anyways if I understand correctly what you want is only numbers as output.

您提供的白名单没问题,但tesseract 会强制将字母与白名单中指定的数字匹配.没有办法让它省略某些字符,但你可以做的是为整个字母表设置白名单,然后在代码中手动将字母与数字分开.

The whitelist you provided is okay but tesseract will forcefully match the letters to the numbers specified in the whitelist. There is no way to make it omitt certain characters,but what you could do is set the whitelist for the whole alphabet and then manually separate letters from numbers in your code.

这篇关于使用 tess-two 库从 android 中的 Bitmap 中提取数字的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆