【问题标题】:How to sharpen a image in android?如何在android中锐化图像?
【发布时间】:2011-10-22 06:22:20
【问题描述】:

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

 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;
}

但我无法获得理想的效果。有人可以提供更多线索,或者告诉我我的代码有什么错误吗?

谢谢。

【问题讨论】:

    标签: java android image-processing graphics


    【解决方案1】:

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

    public static int rgb (int red, int green, int blue) 自:API 级别 1

    从红色、绿色、蓝色分量中返回一个 color-int。阿尔法 组件是隐式 255(完全不透明)。这些组件值 应该是 [0..255],但是没有执行范围检查,所以如果他们 超出范围,返回的颜色未定义。参数 red 红色 绿色的分量 [0..255] 的绿色分量 [0..255] color blue 颜色的蓝色分量 [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
    

    如果你觉得你的效果太强,你也可以试试:

     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
    

    作为替代

    【讨论】:

    • 你能告诉我如何进行范围检查吗?
    • if (red > 255) { red = 255; } else if (red 255) { 绿色 = 255; } else if (green 255) { 蓝色 = 255; } else if (blue
    • 是的,我是这个意思;或者只是 red = red & 0xFF;蓝色 = 蓝色 & 0xFF;绿色 = 绿色 & 0xFF
    • 请问我们如何在 ColorMatrix 上实现 5x5 矩阵?
    【解决方案2】:
     red = (Color.red(a1) + (Color.red(a2))*(-1) + Color.red(a3) + 
           (Color.red(a4))*(-1) + (Color.red(a6))*(-1) + Color.red(a7) + 
           (Color.red(a8))*(-1) + Color.red(a9))    + Color.red(a5)*5 ;
     if(red < 0 )
        red = 0;
     if(red > 255)
        red = 255;
    
    green = (Color.green(a1) + (Color.green(a2)) *(-1) + Color.green(a3) + 
            (Color.green(a4)) *(-1) + (Color.green(a6))*(-1) + Color.green(a7) + 
            (Color.green(a8))*(-1) + Color.green(a9)) + Color.green(a5)*5 ;
    if(green < 0 )
        green = 0;
    if(green > 255)
        green = 255;
    
    blue = (Color.blue(a1) + (Color.blue(a2))*(-1) + Color.blue(a3) + 
           (Color.blue(a4))*(-1) + (Color.blue(a6))*(-1) + Color.blue(a7) + 
           (Color.blue(a8)) *(-1) + Color.blue(a9))   + Color.blue(a5)*5 ;
    if(blue < 0 )
        blue = 0;
    if(blue > 255)
        blue = 255;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-26
      • 2013-11-22
      • 1970-01-01
      • 2011-04-09
      • 2023-03-06
      • 1970-01-01
      • 2011-11-09
      • 2020-03-08
      相关资源
      最近更新 更多