2014-11-06 81 views
0

我只需要使用藍色通道在Android中對灰度圖進行灰度處理。 我設法通過使用顏色矩陣來消除綠色和紅色通道,但是當我將該矩陣的飽和度設置爲0時,它忽略了以前對紅色和綠色通道的更改。使用顏色矩陣僅使用藍色通道將顏色位圖轉換爲灰度圖像

有沒有辦法完成我的任務?遍歷整個像素陣列不是一個選項,因爲它太慢了。

我使用這段代碼:

public Bitmap ConvertToGrayscale(Bitmap bitmap) { 
    int height = super.getHeight(); 
    int width = super.getWidth(); 

    float[] arrayForColorMatrix = new float[] {0, 0, 0, 0, 0, 
               0, 0, 0, 0, 0, 
               0, 0, 1, 0, 0, 
               0, 0, 0, 1, 0}; 

    Bitmap.Config config = bitmap.getConfig(); 
    Bitmap grayScaleBitmap = Bitmap.createBitmap(width, height, config); 

    Canvas c = new Canvas(grayScaleBitmap); 
    Paint paint = new Paint(); 

    ColorMatrix matrix = new ColorMatrix(arrayForColorMatrix); 
    matrix.setSaturation(0); 

    ColorMatrixColorFilter filter = new ColorMatrixColorFilter(matrix); 
    paint.setColorFilter(filter); 

    c.drawBitmap(bitmap, 0, 0, paint); 

    return grayScaleBitmap; 
} 

回答

2

從藍色通道獲得的灰度縮放的圖像的正確矩陣如下:

float[] arrayForColorMatrix = new float[] {0, 0, 1, 0, 0, 
              0, 0, 1, 0, 0, 
              0, 0, 1, 0, 0, 
              0, 0, 0, 1, 0}; 

From the Android documentation:

當應用於顏色[r,g,b,a]時,生成的顏色計算爲(夾緊後):

R' = a*R + b*G + c*B + d*A + e; 
G' = f*R + g*G + h*B + i*A + j; 
B' = k*R + l*G + m*B + n*A + o; 
A' = p*R + q*G + r*B + s*A + t; 

用我arrayForColorMatrix我得到的RGB顏色成分的每一個值,這將導致基於藍色通道的灰度位圖縮放的藍色值。