2013-02-14 61 views
3

我想写一个方法,将采取Bitmap并强制它到一个严格的黑白图像(无灰度)。位图阈值更快

我第一次位图传递到这使得它灰度图使用colormatrix的方法:

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

    Bitmap bmpGrayscale = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565); 
    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; 
} 

的作品很好,速度很快..

然后我把它传递给另一种方法来迫使greyscaled图像2彩色图像(黑色和白色),此方法有效,但显然它是将通过各像素,并且需要很长的时间:

public Bitmap toStrictBlackWhite(Bitmap bmp){ 
     Bitmap imageOut = bmp; 
     int tempColorRed; 
     for(int y=0; y<bmp.getHeight(); y++){ 
      for(int x=0; x<bmp.getWidth(); x++){ 
       tempColorRed = Color.red(imageOut.getPixel(x,y)); 
       Log.v(TAG, "COLOR: "+tempColorRed); 

       if(imageOut.getPixel(x,y) < 127){ 
        imageOut.setPixel(x, y, 0xffffff); 
       } 
       else{ 
        imageOut.setPixel(x, y, 0x000000); 
       }    
      } 
     } 
     return imageOut; 
    } 

任何人KNO以更快更有效的方式来做到这一点?

+1

除了kcoppock下面的答案(其速度会更快)之外,如果使用图像中位数而不是常量“<127”,通常会获得更好的质量阈值。这是一种流行的方法,因为它几乎适用于任何图像,无论光/暗比如何,几乎在任何情况下都能提供清晰的图像。有一个链接[http://stackoverflow.com/a/8959828/752320]显示了一种方法,以及阈值噪声的附加步骤,可以进一步清理图像。整件事对我来说很好,而且速度也很快。 – Geobits 2013-02-15 01:35:48

回答

3

请勿使用getPixel()setPixel()

使用getPixels()这将返回一个所有像素的多维数组。在阵列上进行本地操作,然后使用setPixels()设置修改后的阵列。这将会显着加快。