2013-11-28 5 views
1

В приложении для Android-приложений для чтения визитных карточек мне нужно преобразовать растровое изображение с цветным изображением на черный & белое изображение растровое изображение (не изображение с серой шкалой) для чтения текста OCR. поэтому, пожалуйста, помогите мне преобразовать растровое изображение цветного изображения в черный & белое изображение растровое изображение в android.Как преобразовать растровое изображение растрового изображения в черно-белое изображение растрового изображения в android?

ответ

0

Для преобразования в черно-белый цвет необходимо использовать ColorMatrix и ColorFilter класс. Используйте ColorMatrix - ColorMatrix cm1 = new ColorMatrix(new float[]{0.5f,0.5f,0.5f,0,0, 0.5f,0.5f,0.5f,0,0, 0.5f,0.5f,0.5f,0,0, 0,0,0,1,0,0, 0,0,0,0,1,0 });

1

Вы можете преобразовать изображение, применяя цветовой фильтр следующим образом:

Bitmap bwBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); 
Canvas canvas = new Canvas(bwBitmap); 
//set contrast 
ColorMatrix contrastMatrix = new ColorMatrix(); 
//change contrast 
float contrast = 50.f; 
float shift = (-.5f * contrast + .5f) * 255.f; 
contrastMatrix .set(new float[] { 
     contrast , 0, 0, 0, shift , 
     0, contrast , 0, 0, shift , 
     0, 0, contrast , 0, shift , 
     0, 0, 0, 1, 0 }); 
//apply contrast 
Paint contrastPaint = new Paint(); 
contrastPaint.setColorFilter(new ColorMatrixColorFilter(contrastMatrix)); 
canvas.drawBitmap(colorBitmap, 0, 0, contrastPaint); 

//set saturation 
ColorMatrix saturationMatrix = new ColorMatrix(); 
saturationMatrix.setSaturation(0); //you set color saturation to 0 for b/w 
//apply new saturation 
Paint saturationPaint = new Paint(); 
saturationPaint.setColorFilter(new ColorMatrixColorFilter(saturationPaint)); 
canvas.drawBitmap(colorBitmap, 0, 0, saturationPaint); 
+1

Если я использую выше кода он будет производят изображение серого цвета, а не чистое черно-белое изображение, в моем приложении нужно прочитать текст в визитной карточке/визитной карточке. пожалуйста помогите. –

+0

Обычно изображение серого цвета считается ч/б. То, что вам нужно, - это изображение с серой шкалой с высоким уровнем контраста, чтобы темные серые стали черными, а светлые серые стали белыми. Вы можете добиться изменения контраста изображения. Я отредактировал мой комментарий, вставив код, чтобы сделать эту настройку простейшей ColorMatrix. Попытайтесь изменить значение контраста, чтобы найти лучший результат для вас. –

+0

Если я использую выше метод ma.set(), он снова будет менять изображение в виде графического изображения на цветное изображение с контрастом. пожалуйста помогите. –

1

Этот вопрос является давно, но, вероятно, я мог бы помочь другим пользователям. У меня также был длинный поиск для создания (быстрого) чистого черно-белого растрового изображения.

Мой первый Methode используется bitmap.getPixel() и bitmap.setPixel() Это заняло около 8 секунд (832 х 1532) Новый метод взяли 0.4 сек! Благодаря коэффициенту 20!

Теперь я загружаю все пиксели в Int массива и идти так через все пиксели с getPixels (..) и setPixels (..): Вот мой метод:

public static Bitmap createBlackAndWhite(Bitmap src) { 
    int width = src.getWidth(); 
    int height = src.getHeight(); 

    Bitmap bmOut = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); 

    final float factor = 255f; 
    final float redBri = 0.2126f; 
    final float greenBri = 0.2126f; 
    final float blueBri = 0.0722f; 

    int length = width * height; 
    int[] inpixels = new int[length]; 
    int[] oupixels = new int[length]; 

    src.getPixels(inpixels, 0, width, 0, 0, width, height); 

    int point = 0; 
    for(int pix: inpixels){ 
     int R = (pix >> 16) & 0xFF; 
     int G = (pix >> 8) & 0xFF; 
     int B = pix & 0xFF; 

     float lum = (redBri * R/factor) + (greenBri * G/factor) + (blueBri * B/factor); 

     if (lum > 0.4) { 
      oupixels[point] = 0xFFFFFFFF; 
     }else{ 
      oupixels[point] = 0xFF000000; 
     } 
     point++; 
    } 
    bmOut.setPixels(oupixels, 0, width, 0, 0, width, height); 
    return bmOut; 
} 
Смежные вопросы