Convertir todos los colores distintos de un color en particular en un mapa de bits a blanco

Estoy utilizando tess-dos biblioteca y deseo convertir todos los colores distintos de negro en mi imagen a blanco (Negro será texto). Por lo tanto, hacer más fácil para el tess-dos a leer el texto. He intentado varios métodos pero están tomando demasiado tiempo mientras que convierten pixel por pixel. ¿Hay una manera de lograr esto con lienzo o cualquier cosa que dar resultados más rápido.

ACTUALIZAR

Otro problema que surgió con este algoritmo es que la impresora no imprime con el mismo negro y blanco como en android. Así que el algoritmo convierte la imagen completa en blanco.

Pixel por pixel método que estoy usando actualmente.

binarizedImage = convertToMutable(cropped);// the bitmap is made mutable int width = binarizedImage.getWidth(); int height = binarizedImage.getHeight(); int[] pixels = new int[width * height]; binarizedImage.getPixels(pixels, 0, width, 0, 0, width, height); for(int i=0;i<binarizedImage.getWidth();i++) { for(int c=0;c<binarizedImage.getHeight();c++) { int pixel = binarizedImage.getPixel(i, c); if(!(pixel == Color.BLACK || pixel == Color.WHITE)) { int index = c * width + i; pixels[index] = Color.WHITE; binarizedImage.setPixels(pixels, 0, width, 0, 0, width, height); } } } 

Per, el comentario de Rishabh. Utilice una matriz de color. Dado que el negro es negro y es RGB (0,0,0,255), es inmune a las multiplicaciones. Así que si usted multiplica todo por 255 en todos los canales, todo excederá el límite y se prensará al blanco, excepto el negro que permanecerá negro.

  ColorMatrix bc = new ColorMatrix(new float[] { 255, 255, 255, 0, 0, 255, 255, 255, 0, 0, 255, 255, 255, 0, 0, 0, 0, 0, 1, 0, }); ColorMatrixColorFilter filter = new ColorMatrixColorFilter(bc); paint.setColorFilter(filter); 

Puede usar esa pintura para pintar ese mapa de bits en gloria de filtro de color-matriz negras.

Nota: Este es un truco rápido e increíble, pero, sólo funcionará para el negro. Si bien es perfecto para su uso y convertirá ese largo op en algo que es instantáneo, en realidad no se ajusta a la cuestión del título de "un color en particular" mi algoritmo funciona en cualquier color que desee, siempre y cuando sea negro.

Aunque la respuesta @Tatarize fue perfecta, tenía problemas para leer una imagen impresa, ya que no siempre era negra.

Este algoritmo que encontré en el desbordamiento de pila funciona muy bien, realmente comprueba si el píxel en particular está más cerca de negro o blanco y convierte el píxel en el color más cercano. Por lo tanto proporcionando binarización con rango. ( https://stackoverflow.com/a/16534187/3710223 ).

Lo que estoy haciendo ahora es mantener las áreas no deseadas en colores claros mientras texto en negro. Este algoritmo da imagen binarizada en aproximadamente 20-35 seg. Todavía no es tan rápido pero eficiente.

 private static boolean shouldBeBlack(int pixel) { int alpha = Color.alpha(pixel); int redValue = Color.red(pixel); int blueValue = Color.blue(pixel); int greenValue = Color.green(pixel); if(alpha == 0x00) //if this pixel is transparent let me use TRASNPARENT_IS_BLACK return TRASNPARENT_IS_BLACK; // distance from the white extreme double distanceFromWhite = Math.sqrt(Math.pow(0xff - redValue, 2) + Math.pow(0xff - blueValue, 2) + Math.pow(0xff - greenValue, 2)); // distance from the black extreme double distanceFromBlack = Math.sqrt(Math.pow(0x00 - redValue, 2) + Math.pow(0x00 - blueValue, 2) + Math.pow(0x00 - greenValue, 2)); // distance between the extremes double distance = distanceFromBlack + distanceFromWhite; return ((distanceFromWhite/distance)>SPACE_BREAKING_POINT); } 

Si el valor devuelto es verdadero entonces convertimos el píxel en negro o lo convertimos en blanco.

Sé que puede haber respuestas mejores / más rápidas y más respuestas son bienvenidas 🙂

Lo mismo pero hecho en renderscript, tiempos de 60-100ms. Ni siquiera notará el retraso.

  Bitmap blackbitmap = Bitmap.createBitmap(bitmap.getWidth(),bitmap.getHeight(),bitmap.getConfig()); RenderScript mRS = RenderScript.create(TouchEmbroidery.activity); ScriptC_blackcheck script = new ScriptC_blackcheck(mRS); Allocation allocationRaster0 = Allocation.createFromBitmap( mRS, bitmap, Allocation.MipmapControl.MIPMAP_NONE, Allocation.USAGE_SCRIPT ); Allocation allocationRaster1 = Allocation.createTyped(mRS, allocationRaster0.getType()); script.forEach_root(allocationRaster0, allocationRaster1); allocationRaster1.copyTo(blackbitmap); 

¿La asignación, utiliza renderscript para escribir los datos en blackbitmap.

 #pragma version(1) #pragma rs java_package_name(<YOUR PACKAGENAME GOES HERE>) void root(const uchar4 *v_in, uchar4 *v_out) { uint32_t value = (v_in->r * v_in->r); value = value + (v_in->g * v_in->g); value = value + (v_in->b * v_in->b); if (value > 1200) { v_out->r = 255; v_out->g = 255; v_out->b = 255; } else { v_out->r = 0; v_out->g = 0; v_out->b = 0; } v_out->a = 0xFF; } 

Tenga en cuenta que el 1200 es sólo el umbral que usé, debe ser los tres componentes menos de 20 (o, como 0, 0, sqrt (1200) aka (~ 34)). Puede configurar el límite de 1200 arriba o abajo en consecuencia.

Y el gradle de la estructura necesita Renderscript:

 renderscriptTargetApi 22 

Las últimas pocas cosas de las herramientas de construcción dicen haber arreglado un montón de los dolores de cabeza de renderscript. Así que podría ser perfectamente razonable hacer este tipo de cosas en lugares de misión crítica como el suyo. 20 segundos es demasiado largo para esperar, 60 milisegundos no lo es.

  • Mejorar el rendimiento de Tesseract con OpenCV en Android
  • ¿Cómo utilizar OpenCV + Tesseract para el reconocimiento de texto exacto en Android?
  • Incluyendo Tess4J a un proyecto Java como biblioteca en Eclipse
  • Leptonica para mejorar tesseract ocr en android
  • Android Tesseract progreso de devolución de llamada
  • Tesseract v3.03 hacer PDF con texto de búsqueda de ejemplo
  • Android Tesseract OCR 7 dígitos de segmento
  • El proyecto no se creó debido a "No se pudo eliminar" / tesseract-android-tools / bin / classes / com en Linux
  • Detección de objetos para android con tesseract o OpenCV
  • Creación de una actividad de cámara optimizada / adecuada para OCR
  • Usando tesseract en android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.