使用 tess-two 库从 android 中的 Bitmap 中提取数字 [英] extracting numbers from Bitmap in android using tess-two library
问题描述
我想从位图中提取一个数字.我正在使用 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屋!