android 图片特效处理之锐化效果-程序员宅基地

技术标签: java  运维  移动开发  

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

算法原理:

一、简单算法:分别获取当前像素点和八个周围像素点的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; 
[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点进行锐化。

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

下面看效果图:

原图:


处理后:


貌似处理有点问题,中间会看到很多的竖线,很明显,可能是没有优化好,因为采用了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.     }  


转载于:https://www.cnblogs.com/Free-Thinker/p/6722606.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_30627381/article/details/99072516

智能推荐

Linux第一个小程序——进度条-程序员宅基地

文章浏览阅读3k次,点赞11次,收藏22次。Linux第一个小程序&进度条

Chrome不保存sessionId,Chrome浏览器改变SameSite设置_浏览器如何设置不携带session id访问-程序员宅基地

文章浏览阅读2.5k次。原文:https://www.lizenghai.com/archives/56035.html#i-2Chrome 80 默认将没有设置SameSite设置为SameSite=Lax谷歌浏览器地址栏输入:chrome://flags/找到:SameSite by default cookies、Cookies without SameSite must be secure设置上面这两项设置成 Disable..._浏览器如何设置不携带session id访问

Java如何获取系统cpu、内存、硬盘信息-程序员宅基地

文章浏览阅读80次。1 概述  前段时间摸索在Java中怎么获取系统信息包括cpu、内存、硬盘信息等,刚开始使用Java自带的包进行获取,但这样获取的内存信息不够准确并且容易出现找不到相应包等错误,所以后面使用sigar插件进行获取。下面列举出了这两种方式获取系统信息的方式及代码。2 使用Java自带包获取系统信息2.1 使用Java自带包获取系统信息代码如下:2.1.1 Bytes.java复制代码pub..._java arm和x86通用获取cpu 内存等信息

powershell各种反弹姿势以及取证(二)-程序员宅基地

文章浏览阅读118次。mickey · 2015/05/25 10:17 0x00 简介这篇主要是取证的,如果我以后技术好了,也会写写powershell在内网渗透中的实战应用,本文所有的内容基本翻译自fireEyE的&lt;&lt;Investigating Powershell Attack&..._powershell save as evtx

ubuntu 18.04 安装无线驱动和显卡驱动_ubuntu18.04 无线网卡驱动-程序员宅基地

文章浏览阅读2.3k次,点赞3次,收藏8次。一、 安装无线驱动去github下载MT7630E的zip包 解压缩目录下输入以下命令sudo apt install build-essential linux-headers-amd64chmod +x install test uninstall bpatchsudo ./install二、 安装显卡驱动1. 获取显卡型号我的是GTX720M2. 查看支持的..._ubuntu18.04 无线网卡驱动

php 公众号 获取菜单,微信公众号利用PHP创建自定义菜单的方法-程序员宅基地

文章浏览阅读184次。在使用通用接口前,你需要做以下两步工作:1.拥有一个微信公众账号,并获取到appid和appsecret(在公众平台申请内测资格,审核通过后可获得)2.通过获取凭证接口获取到access_token注意:access_token是第三方访问api资源的票据;access_token对应于公众号是全局唯一的票据,重复获取将导致上次获取的access_token失效。访问下面这个地址(注意替换你的ap..._php公众号菜单创建后获取

随便推点

AOP--面向切面编程-程序员宅基地

文章浏览阅读417次。切入点表达式:描述切入点方法的一种表达式。

MFC添加背景图片_mfc设置背景图片-程序员宅基地

文章浏览阅读5.5k次,点赞8次,收藏92次。很长时间没有接触MFC相关的知识了,我大概是在大二时候学习的MFC相关知识及图像处理,现在由于要帮个朋友完成个基于C++的程序,所以又回顾了下相关知识。的确,任何知识一段时间过后都比较容易忘记,但回顾起来还是很有印象的。这篇文章主要是回顾以前的MFC基础知识,给对话框添加背景图片和给按钮button添加背景图片;希望此篇基础性文章对大家有所帮助!同时为下次做MFC相关知识提供..._mfc设置背景图片

MTCNN 论文学习_mtcnn算法论文-程序员宅基地

文章浏览阅读772次。Joint Face Detection and Alignment using Multi-task Cascaded Convolutional NetworkAbstract1. Introduction2. ApproachA. Overall FrameworkB. CNN ArchitectureC. Training3. Experiments论文地址:https://arxiv...._mtcnn算法论文

GPU加速计算_gpu实际使用功率怎么算的-程序员宅基地

文章浏览阅读944次。GPU加速计算NVIDIA A100 Tensor Core GPU 可针对 AI、数据分析和高性能计算 (HPC),在各种规模上实现出色的加速,应对极其严峻的计算挑战。作为 NVIDIA 数据中心平台的引擎,A100 可以高效扩展,系统中可以集成数千个 A100 GPU,也可以利用 NVIDIA 多实例 GPU (MIG) 技术将每个 A100 划分割为七个独立的 GPU 实例,以加速各种规模的工作负载。第三代 Tensor Core 技术为各种工作负载的更多精度水平提供加速支持,缩短获取洞见以及产品_gpu实际使用功率怎么算的

用 Python 制作各种用途的二维码-程序员宅基地

文章浏览阅读191次。当你提到二维码时,大多数人想到的是仓库管理或产品标签等 "工业 "应用,但这篇文章在很大程度上是关于二维码的个人和社会用途。有趣的事实二维(QR)码是在1994年发明的,最近几年由于新冠肺炎的出现,它的"非接触 "特性使其应用广泛。二维码具备良好的解决方案。它可以被几乎所有的手机使用默认的照片应用程序扫描,同样,扫描它们也会根据它们的背景触发某种动作。例如,一个含有URL的QR码允许你在浏览器中打..._python实现二维码隐藏

k8s修改pod固化方案_pod怎么固化配置-程序员宅基地

文章浏览阅读1.6k次。方案思路:先在docker 容器级别将所需改动完成,然后commit该容器为一个新的镜像到仓库,最后在k8s ds中启用该镜像。操作流程:一、定位到apigateway后台docker容器,并进入[root@hdp1 shanghaibank-hotfix]# docker ps |grep apigateway923002acb833 63f4ed014d9b _pod怎么固化配置

推荐文章

热门文章

相关标签