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

算法原理:

一、简单算法:分别获取当前像素点和八个周围像素点的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. java9新特性-6-多版本兼容jar包

    1.官方Feature 238: Multi-Release JAR Files 2.使用说明 当一个新版本的Java出现的时候,你的库用户要花费数年时间才会切换到这个新的版本.这就意味着库得去向后兼 ...

  2. monitoring_db

    #!/bin/bash# Program: # Automatic inspection operation system and oracle database.# History:# 2016/0 ...

  3. 创建支持SSH服务的镜像

    一.基于commit命令创建 docker commit CONTAINER [REPOSITORY [:TAG]] 1.使用ubuntu镜像创建一个容器 docker run -it ubuntu ...

  4. MySQL 大数据量文本插入

    导入几万条数据需要等好几分钟的朋友来围观一下! 百万条数据插入,只在一瞬间.呵呵夸张,夸张!! 不到半分钟是真的! 插入指令: load data infile 'c:/wamp/tmp/Data_O ...

  5. 到2023年将会有超过90%的PC采用SSD硬盘

    本文转载自超能网,其他媒体转载需经超能网同意 现在买电脑或者自己装机,还有谁不要SSD硬盘吗?这个问题似乎没什么可说的,SSD硬盘各种好,装机可以说是必选了,但实际上现在的SSD适配率并没有想象中那么 ...

  6. PKU 3281 Dining 网络流 (抄模板)

    题意: 农夫约翰为他的牛准备了F种食物和D种饮料.每头牛都有各自喜欢的食物和饮料,而每种食物或饮料只能分配给一头牛.最多能有多少头牛可以同时得到各自喜欢的食物和饮料? 思路: 用 s -> 食物 ...

  7. 题解 P2330 【[SCOI2005]繁忙的都市】

    又是一道Kruskal题目. AC代码见下. 主要思路就是将所有的边储存起来,然后进行贪心地选择,期间需要判断两个端点是否有关联,这一过程通过并查集实现.Kruskal部分套模板就可以了. #incl ...

  8. Java基础学习总结(23)——GUI编程

    一.AWT介绍 所有的可以显示出来的图形元素都称为Component,Component代表了所有的可见的图形元素,Component里面有一种比较特殊的图形元素叫Container,Containe ...

  9. AndroidMainfest.xml具体解释——&lt;activity&gt;

    语法: <activity android:allowEmbedded=["true" | "false"] android:allowTaskRepar ...

  10. shell 脚本去掉月份和天数的前导零

    #!/bin/sh # # shell 脚本去掉月份和天数的前导零 # 前面填 1 变成百位数,然后减 100 # 去掉前导零的通用方法 $((10#$(date +%m))) # 把字符串分割成数组 ...