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

算法原理:

一、简单算法:分别获取当前像素点和八个周围像素点的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. ArcGIS api for javascript——地图配置-定制平移动画

    描述 本例展示了当用户点击平移按钮时如何定制地图的动画.panDuration和panRate是Dojo动画属性,可以分别确定动画的duration和帧刷新的rate.这些属性的单位都是毫秒,panD ...

  2. Units are seconds since 1970.

    在Android实际开发过程中常常会碰到以秒为单位的日期.这时能够依据须要将他们进行格式化处理,详细过程例如以下: long seconds=Long.parseLong("14058896 ...

  3. No enclosing instance of type E is accessible.

    No enclosing instance of type E  is accessible. 静态方法(main)中调用内部类,会出现这样的问题: 学习了:https://www.cnblogs.c ...

  4. 怎样在HP-UX中安装bash?

     怎样在HP-UX中安装bash? 注:HPUX全称是Hewlett Packard UniX是惠普9000系列server的Unix操作系统,能够在HP的PA-RISC处理器.Intel的Ita ...

  5. style="background-image: url(__HOMEPAGE__/views/IMJ2V2/images/banner2.jpg)"

    style="background-image: url(__HOMEPAGE__/views/IMJ2V2/images/banner2.jpg)" 一.问题 backgroun ...

  6. php 扩展

    如何利用PHP扩展函数,扩展出自己的函数等 php扩展函数有哪些zend_parse_parameters() spprintf() RETURN_STRINGL()

  7. input file HTML控件控制

    网页上添加一个input file HTML控件: 1 <input id="File1" type="file" /> 默认是这样的,所有文件类型 ...

  8. 配置CiscoWorks 2000 ANI同步

    配置CiscoWorks 2000 ANI同步       在CiscoWorks 2000的LAN ManagementSolution(LMS)中,Cisco包含了一种ANI的自动发现过程和Res ...

  9. 互联网金融研究组:P2P借贷平台:性质、风险与监管(上)

    互联网金融研究组(): P2P借贷平台:性质.风险与监管(上) 目 录 一.性质与合法性 1.  P2P网络借贷 1.1  概念重新界定 1.2  发展概况与特点 2.  延伸模式及其合法性浅析 2. ...

  10. C++ new 的用法

    原文链接:http://www.builder.com.cn/2008/0104/696370.shtml “new”是C++的一个关键字,同时也是操作符.关于new的话题非常多,因为它确实比较复杂, ...