使用5x5颜色矩阵进行位图

时间:2015-11-02 09:27:49

标签: android image-processing

我有一个方法可以使用滤镜为位图添加效果。例如:

public static Bitmap changeContrast(Bitmap bmp, float contrast)
{
    ColorMatrix cm = new ColorMatrix(new float[]
            {
                    contrast, 0, 0, 0, 0,
                    0, contrast, 0, 0, 0,
                    0, 0, contrast, 0, 0,
                    0, 0, 0, 1, 0
            });

    return getBitmapFromColorMatrix(cm, bmp);
}

但是,我想使用锐化滤镜矩阵:

 0  0  0  0  0  
 0 -1 -1 -1  0
 0 -1  9 -1  0
 0 -1 -1 -1  0 
 0  0  0  0  0

但ColorMatrix只接受4x5矩阵阵列。有没有办法可以将5x5矩阵用于我的位图?

我尝试了什么:

我尝试使用ScriptIntrinsicConvolve5x5类,但它需要API17及更高版本,但我需要使用api到API14。我怎样才能做到这一点。请帮忙。

更新:

这是getBitmapFromColorMatrix()的代码,这可能会有所帮助。

    static Bitmap getBitmapFromColorMatrix (ColorMatrix cm, Bitmap sourceBitmap) {
       Bitmap ret = Bitmap.createBitmap(sourceBitmap.getWidth(), sourceBitmap.getHeight(), sourceBitmap.getConfig());

       Canvas canvas = new Canvas(ret);

       Paint paint = new Paint();
       paint.setColorFilter(new ColorMatrixColorFilter(cm));
       canvas.drawBitmap(sourceBitmap, 0, 0, paint);

       return ret;
   }

1 个答案:

答案 0 :(得分:2)

这个问题已经过时了,但是如果您仍然感兴趣,正如您所指出的,ColorMatrix使用的是4x5矩阵,主要是因为没有使用第5行。 ScriptIntrinsicConvolve5x5不是你想要的。正如https://stackoverflow.com/a/27454681/852795所指出的,“Convolve5x5是一个根本不同的操作,不支持每个通道的不同常量.ColorMatrix实际上是你想要的操作,应该很快。”

查看“锐化滤镜矩阵”,您的底行全部为零,因此您应该可以忽略它。尝试将其移除并抽入4x5矩阵以查看是否有效。

public static Bitmap sharpeningFilter(Bitmap bmp)
{
    ColorMatrix cm = new ColorMatrix(new float[]
            {
                    0, 0, 0, 0, 0,
                    0, -1, -1, -1, 0,
                    0, -1, 9, -1, 0,
                    0, -1, -1, -1, 0
            });

    return getBitmapFromColorMatrix(cm, bmp);
}

顺便说一下,如果你想同时锐化和对比,你可以在使用cm.postConcat(new ColorMatrix(mat));然后ColorMatrixColorFilter(cm);之前将ColorMatrices与Paint.setColorFilter()连接起来。

最后,请查看https://stackoverflow.com/a/15119089/852795,了解亮度,对比度,饱和度和色调的ColorMatix资源。您会注意到@Pablo使用5x5矩阵,但第5行始终为0, 0, 0, 0, 1,因此无关紧要,因为它无论如何都会被忽略。