android图片特效处理之锐化效果

高斋晓开卷,独共圣人语。这篇文章主要讲述android图片特效处理之锐化效果相关的知识,希望能为你提供帮助。
这篇将讲到图片特效处理的锐化效果。跟前面一样是对像素点进行处理,算法是通用的。

算法原理:
一、简单算法:分别获取当前像素点和八个周围像素点的RGB值,先求出当前像素点的RGB值与八个像素点RGB值的和的平均数,再乘以相应的系数,然后在与当前像素点之和。
例:
ABC
【android图片特效处理之锐化效果】DEF
GHI
对E点进行锐化:
[java] view plaincopy

  1. float delta = 0.3;  
  2. E.r = (E.r - (A.r + B.r + C.r + D.r + F.r + G.r + H.r + I.r) / 8) * delta + E.r;  
[java] view plain copy
  1. float  delta  =  0.3;    
  2. E.r  =  (E.r  -  (A.r  +  B.r  +  C.r  +  D.r  +  F.r  +  G.r  +  H.r  +  I.r)  /  8)  *  delta  +  E.r;    
 
E.g,E.b类似,delta建议取0.3,具体多少无所谓,试一下就知道了。但按照上面原理,没有达到预期的效果,改变delta的值也不行,所以后面代码就不贴出来了,感兴趣的可以研究一下。


二、拉普拉斯变换:将拉普拉斯矩阵中的项与相应点的RGB值之积再乘以相应的系数的和作为当前点的RGB值。
例:用上面的例子,还是对E点进行锐化。
[java] view plaincopy
  1. // 拉普拉斯矩阵 
  2. int[] laplacian = new int[] { -1, -1, -1, -1, 9, -1, -1, -1, -1 };  
  3. float delta = 0.3;    
  4. E.r = A.r * laplacian[0] * delta + B.r * laplacian[1] * delta + C.r * laplacian[2] * delta + D.r * laplacian[3] * delta + E.r * laplacian[4] * delta + F.r * laplacian[5] * delta + G.r * laplacian[6] * delta + H.r * laplacian[7] * delta + I.r * laplacian[8] * delta;  
  5. // E.g和E.b值类似 
[java] view plain copy
  1. //  拉普拉斯矩阵   
  2. int[]  laplacian  =  new  int[]  {  -1,  -1,  -1,  -1,  9,  -1,  -1,  -1,  -1  };    
  3. float  delta  =  0.3;      
  4. E.r  =  A.r  *  laplacian[0]  *  delta  +  B.r  *  laplacian[1]  *  delta  +  C.r  *  laplacian[2]  *  delta  +  D.r  *  laplacian[3]  *  delta  +  E.r  *  laplacian[4]  *  delta  +  F.r  *  laplacian[5]  *  delta  +  G.r  *  laplacian[6]  *  delta  +  H.r  *  laplacian[7]  *  delta  +  I.r  *  laplacian[8]  *  delta;    
  5. //  E.g和E.b值类似   

下面看效果图:
原图:
android图片特效处理之锐化效果

文章图片


处理后:
android图片特效处理之锐化效果

文章图片


貌似处理有点问题,中间会看到很多的竖线,很明显,可能是没有优化好,因为采用了getPiexels() 和setPixels()方法,所以一维数组的对应图片的宽高有点麻烦。
下面贴代码,仅供参数,同样注意图片的大小,数组大小不能超过虚拟机规定值。
 
[java] view plain copy
    1. /** 
    2.           *  图片锐化(拉普拉斯变换) 
    3.           *  @param  bmp 
    4.           *  @return 
    5.           */   
    6.         private  Bitmap  sharpenImageAmeliorate(Bitmap  bmp)   
    7.         {   
    8.                 long  start  =  System.currentTimeMillis();    
    9.                 //  拉普拉斯矩阵   
    10.                 int[]  laplacian  =  new  int[]  {  -1,  -1,  -1,  -1,  9,  -1,  -1,  -1,  -1  };    
    11.                    
    12.                 int  width  =  bmp.getWidth();    
    13.                 int  height  =  bmp.getHeight();    
    14.                 Bitmap  bitmap  =  Bitmap.createBitmap(width,  height,  Bitmap.Config.RGB_565);    
    15.                    
    16.                 int  pixR  =  0;    
    17.                 int  pixG  =  0;    
    18.                 int  pixB  =  0;    
    19.                    
    20.                 int  pixColor  =  0;    
    21.                    
    22.                 int  newR  =  0;    
    23.                 int  newG  =  0;    
    24.                 int  newB  =  0;    
    25.                    
    26.                 int  idx  =  0;    
    27.                 float  alpha  =  0.3F;    
    28.                 int[]  pixels  =  new  int[width  *  height];    
    29.                 bmp.getPixels(pixels,  0,  width,  0,  0,  width,  height);    
    30.                 for  (int  i  =  1,  length  =  height  -  1;   i  <   length;   i++)   
    31.                 {   
    32.                         for  (int  k  =  1,  len  =  width  -  1;   k  <   len;   k++)   
    33.                         {   
    34.                                 idx  =  0;    
    35.                                 for  (int  m  =  -1;   m  < =  1;   m++)   
    36.                                 {   
    37.                                         for  (int  n  =  -1;   n  < =  1;   n++)   
    38.                                         {   
    39.                                                 pixColor  =  pixels[(i  +  n)  *  width  +  k  +  m];    
    40.                                                 pixR  =  Color.red(pixColor);    
    41.                                                 pixG  =  Color.green(pixColor);    
    42.                                                 pixB  =  Color.blue(pixColor);    
    43.                                                    
    44.                                                 newR  =  newR  +  (int)  (pixR  *  laplacian[idx]  *  alpha);    
    45.                                                 newG  =  newG  +  (int)  (pixG  *  laplacian[idx]  *  alpha);    
    46.                                                 newB  =  newB  +  (int)  (pixB  *  laplacian[idx]  *  alpha);    
    47.                                                 idx++;    
    48.                                         }   
    49.                                 }   
    50.                                    
    51.                                 newR  =  Math.min(255,  Math.max(0,  newR));    
    52.                                 newG  =  Math.min(255,  Math.max(0,  newG));    
    53.                                 newB  =  Math.min(255,  Math.max(0,  newB));    
    54.                                    
    55.                                 pixels[i  *  width  +  k]  =  Color.argb(255,  newR,  newG,  newB);    
    56.                                 newR  =  0;    
    57.                                 newG  =  0;    
    58.                                 newB  =  0;    
    59.                         }   
    60.                 }   
    61.                    
    62.                 bitmap.setPixels(pixels,  0,  width,  0,  0,  width,  height);    
    63.                 long  end  =  System.currentTimeMillis();    
    64.                 Log.d("may",  "used  time="+(end  -  start));    
    65.                 return  bitmap;    
    66.         } 






    推荐阅读