这篇将讲到图片特效处理的锐化效果。跟前面一样是对像素点进行处理,算法是通用的。

算法原理:

一、简单算法:分别获取当前像素点和八个周围像素点的RGB值,先求出当前像素点的RGB值与八个像素点RGB值的和的平均数,再乘以相应的系数,然后在与当前像素点之和。

例:

ABC

DEF

GHI

对E点进行锐化:

  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;
  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点进行锐化。

  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值类似
  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值类似

下面看效果图:

原图:

处理后:

貌似处理有点问题,中间会看到很多的竖线,很明显,可能是没有优化好,因为采用了getPiexels() 和setPixels()方法,所以一维数组的对应图片的宽高有点麻烦。

下面贴代码,仅供参数,同样注意图片的大小,数组大小不能超过虚拟机规定值。

    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. int width = bmp.getWidth();
    12. int height = bmp.getHeight();
    13. Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);
    14. int pixR = 0;
    15. int pixG = 0;
    16. int pixB = 0;
    17. int pixColor = 0;
    18. int newR = 0;
    19. int newG = 0;
    20. int newB = 0;
    21. int idx = 0;
    22. float alpha = 0.3F;
    23. int[] pixels = new int[width * height];
    24. bmp.getPixels(pixels, 0, width, 0, 0, width, height);
    25. for (int i = 1, length = height - 1; i < length; i++)
    26. {
    27. for (int k = 1, len = width - 1; k < len; k++)
    28. {
    29. idx = 0;
    30. for (int m = -1; m <= 1; m++)
    31. {
    32. for (int n = -1; n <= 1; n++)
    33. {
    34. pixColor = pixels[(i + n) * width + k + m];
    35. pixR = Color.red(pixColor);
    36. pixG = Color.green(pixColor);
    37. pixB = Color.blue(pixColor);
    38. newR = newR + (int) (pixR * laplacian[idx] * alpha);
    39. newG = newG + (int) (pixG * laplacian[idx] * alpha);
    40. newB = newB + (int) (pixB * laplacian[idx] * alpha);
    41. idx++;
    42. }
    43. }
    44. newR = Math.min(255, Math.max(0, newR));
    45. newG = Math.min(255, Math.max(0, newG));
    46. newB = Math.min(255, Math.max(0, newB));
    47. pixels[i * width + k] = Color.argb(255, newR, newG, newB);
    48. newR = 0;
    49. newG = 0;
    50. newB = 0;
    51. }
    52. }
    53. bitmap.setPixels(pixels, 0, width, 0, 0, width, height);
    54. long end = System.currentTimeMillis();
    55. Log.d("may", "used time="+(end - start));
    56. return bitmap;
    57. }

android图片特效处理之锐化效果的更多相关文章

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

    这篇将讲到图片特效处理的锐化效果.跟前面一样是对像素点进行处理,算法是通用的. 算法原理: 一.简单算法:分别获取当前像素点和八个周围像素点的RGB值,先求出当前像素点的RGB值与八个像素点RGB值的 ...

  2. android 图片特效处理之 光晕效果

    这篇将讲到图片特效处理的图片光晕效果.跟前面一样是对像素点进行处理,本篇实现的思路可参见android图像处理系列之九--图片特效处理之二-模糊效果和android图像处理系列之十三--图片特效处理之 ...

  3. android 图片特效处理之 图片叠加

    这篇将讲到图片特效处理的图片叠加效果.跟前面一样是对像素点进行处理,可参照前面的android图像处理系列之七--图片涂鸦,水印-图片叠加和android图像处理系列之六--给图片添加边框(下)-图片 ...

  4. android 图片特效处理之光晕效果

    这篇将讲到图片特效处理的图片光晕效果.跟前面一样是对像素点进行处理,本篇实现的思路可参见android图像处理系列之九--图片特效处理之二-模糊效果和android图像处理系列之十三--图片特效处理之 ...

  5. android 图片特效处理之图片叠加

    这篇将讲到图片特效处理的图片叠加效果.跟前面一样是对像素点进行处理,可参照前面的android图像处理系列之七--图片涂鸦,水印-图片叠加和android图像处理系列之六--给图片添加边框(下)-图片 ...

  6. android 图片特效处理之怀旧效果

    图片特效处理系列将介绍图片的像素点的特效处理,这些物资注重的是原理.也就是说只要你知道这些算法不管是C++,VB,C#,Java都可以做出相同的特效.下面将介绍图片怀旧效果的算法.算法如下: 上面公式 ...

  7. android图片特效处理之怀旧效果

    图片特效处理系列将介绍图片的像素点的特效处理,这些物资注重的是原理.也就是说只要你知道这些算法不管是C++,VB,C#,Java都可以做出相同的特效.下面将介绍图片怀旧效果的算法.算法如下: 上面公式 ...

  8. android图片特效处理之图片叠加

    这篇将讲到图片特效处理的图片叠加效果.跟前面一样是对像素点进行处理,可参照前面的android图像处理系列之七--图片涂鸦,水印-图片叠加和android图像处理系列之六--给图片添加边框(下)-图片 ...

  9. android图片特效处理之光晕效果

    这篇将讲到图片特效处理的图片光晕效果.跟前面一样是对像素点进行处理,本篇实现的思路可参见android图像处理系列之九--图片特效处理之二-模糊效果和android图像处理系列之十三--图片特效处理之 ...

随机推荐

  1. 【Henu ACM Round#19 B】 Luxurious Houses

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 从右往左维护最大值. 看到比最大值小(或等于)的话.就递增到比最大值大1就好. [代码] #include <bits/std ...

  2. ArcGIS api for javascript——显示多个ArcGIS Online服务

    描述 本例展示了如何使用按钮在地图里的两个不同的图层间切换.所有地图里的图层恰巧是来自ArcGIS Online的ArcGISTiledMapServiceLayers.按钮是Dojo dijit按钮 ...

  3. Ubuntu14.04下安装和&quot;激活&quot;Office2010ProPlus与Visio2010(15.11.20Updated)

    本人用Ubuntu的时候全然没有打游戏的欲望,故而能够更高效的工作. 尽管说LibreOffice.WPS等等有Ubuntu版本号,可是用着还是没有微软的Office顺手,故而折腾了一下怎样安装Off ...

  4. HDU44979 GCD and LCM (素因子分解+计数)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4497 题意: 求有多少种(x,y,z)使得最小公倍数为l,最大公约数为g 分析: 我们将l,g进行素因 ...

  5. 积跬步,聚小流------Bootstrap学习记录(2)

    现阶段开启每一次新的征程,已然离不开"Hello World"的习惯仪式.这次自然也不例外.先来看下给出的官网给出的演示样例: 1.bootstrap官网提供的html基本模板代码 ...

  6. Dubbo源代码分析(三):Dubbo之服务端(Service)

    如上图所看到的的Dubbo的暴露服务的过程,不难看出它也和消费者端非常像,也须要一个像reference的对象来维护service关联的全部对象及其属性.这里的reference就是provider. ...

  7. php中局部变量和全局变量

    php中局部变量和全局变量 代码1:函数内部使用函数外部变量错误方法 <?php $name = 'fish'; function animal() { echo $name; } animal ...

  8. Javascript 模块化理解

    原始时代: script标签引入javascript文件 -------- html ------- <div id="result"></div> < ...

  9. 昼猫笔记 从此告别复杂代码--JavaScript

    昼猫笔记--给你带来不一样的笔记 不止是笔记 更多的是思考 大家好,我是一只来自喵星的前端初学者,由于我们喵星人科技较为落后,昼猫从今天开始带着使命来到地球学习前端知识. 从今天开始,猫猫我就从Jav ...

  10. du---是对文件和目录磁盘使用的空间查看

    du命令也是查看使用空间的,但是与df命令不同的是Linux du命令是对文件和目录磁盘使用的空间的查看,还是和df命令有一些区别的. 语法 du [选项][文件] 选项 -a或-all 显示目录中个 ...