如何在android中锐化图像?

pen*_*ang 5 java graphics android image-processing

我想要锐化图像,我的代码如下:

 public Bitmap RuiHuaBitmap(Bitmap bitmap) {
    int width, height;
    height = bitmap.getHeight();
    width = bitmap.getWidth();
    int red, green, blue;
    int a1, a2, a3, a4, a5, a6, a7, a8, a9;
    Bitmap bmpBlurred = Bitmap.createBitmap(width, height,bitmap.getConfig());

    Canvas canvas = new Canvas(bmpBlurred);

    canvas.drawBitmap(bitmap, 0, 0, null);
    for (int i = 1; i < width - 1; i++) {
        for (int j = 1; j < height - 1; j++) {

            a1 = bitmap.getPixel(i - 1, j - 1);
            a2 = bitmap.getPixel(i - 1, j);
            a3 = bitmap.getPixel(i - 1, j + 1);
            a4 = bitmap.getPixel(i, j - 1);
            a5 = bitmap.getPixel(i, j);
            a6 = bitmap.getPixel(i, j + 1);
            a7 = bitmap.getPixel(i + 1, j - 1);
            a8 = bitmap.getPixel(i + 1, j);
            a9 = bitmap.getPixel(i + 1, j + 1);

            red = (Color.red(a1) + Color.red(a2) + Color.red(a3) + Color.red(a4) + Color.red(a6) + Color.red(a7) + Color.red(a8) + Color.red(a9)) *(-1)   + Color.red(a5)*9 ;
            green = (Color.green(a1) + Color.green(a2) + Color.green(a3) + Color.green(a4) + Color.green(a6) + Color.green(a7) + Color.green(a8) + Color.green(a9)) *(-1)  + Color.green(a5)*9 ;
            blue = (Color.blue(a1) + Color.blue(a2) + Color.blue(a3) + Color.blue(a4) + Color.blue(a6) + Color.blue(a7) + Color.blue(a8) + Color.blue(a9)) *(-1)   + Color.blue(a5)*9 ;

            bmpBlurred.setPixel(i, j, Color.rgb(red, green, blue));
        }
    }
    return bmpBlurred;
}
Run Code Online (Sandbox Code Playgroud)

但我无法达到理想的效果.有人可以提供更多线索,或者告诉我代码中的错误是什么?

谢谢.

gui*_*ido 8

您缺少对传递给Color.rgb()的rgb值的范围检查; 在调用Color.rgb()方法之前,需要规范化[0..255]范围内的rgb值:

public static int rgb(int red,int green,int blue)从:API Level 1

从红色,绿色,蓝色组件返回color-int.alpha分量是重要的255(完全不透明).这些组件值应为[0..255],但未执行范围检查,因此如果它们超出范围,则返回的颜色未定义.参数红色红色分量[0..255]颜色为绿色绿色分量[0..255]为蓝色蓝色分量[0..255]的颜色

你的卷积矩阵看起来很适合变形:

 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
Run Code Online (Sandbox Code Playgroud)

如果您认为效果太强,您还可以尝试:

 0  0  0  0  0  
 0  0 -1  0  0
 0 -1  5 -1  0
 0  0 -1  0  0 
 0  0  0  0  0
Run Code Online (Sandbox Code Playgroud)

作为备选

  • 是的,我的意思是; 或者只是*red = red&0xFF; blue = blue&0xFF; 绿色=绿色和0xFF* (2认同)