renderScript实现简单的图片处理效果,,这一篇继续介绍一些常用的图片处理算法。

待处理图片

实现模糊效果:

这个效果是我看过各种实例中用过最多的一种,或许是由于模糊效果的常用性,Android提供了封装好的api可以直接调用:

Bitmap overlay = BitmapFactory.decodeResource(getResources(),R.drawable.scene);
RenderScript rs = RenderScript.create(MainActivity.this);
Allocation overlayAlloc = Allocation.createFromBitmap(rs, overlay);//解析bitmap到allocation
ScriptIntrinsicBlur blur = ScriptIntrinsicBlur.create(rs,overlayAlloc.getElement());//创建模糊效果工具类,相当于BlurRS
blur.setInput(overlayAlloc);
blur.setRadius(6);//设置模糊力度
blur.forEach(overlayAlloc);//调用脚本中的核心算法
overlayAlloc.copyTo(overlay);//输出结果到bitmap
view.setBackground(new BitmapDrawable(getResources(),overlay));
rs.destroy();

 
系统提供的模糊算法在调用上与我们写的其他图像处理算法很像,也就是说通过api调用可以省去编写rs脚本的麻烦。Rs脚本和之前的文章写法差不多,也就是算法上对当前像素的取值要参考以当前像素为中心,以r为半径的区域内所有像素点的平均值.
平均值是怎么计算出来的呢?最简单的一种,直接算术平均,把r区域内的所有临近点加起来一除,得到的就是中间点的像素值,这样最终效果较差,因为图像大多是连续的,越靠近区域中间像素关联越大,理应对中心像素产生更大的影响,越远离区域中心,对中心点的影响应该越小,因此,应该采用加权平均更为合理。
有一种加权平均参照高斯分布,以x轴为距中心点距离,y轴为权重,可以用二维高斯函数来建立数学模型:
 
 
                                               (图片来自百度图片)
 
公式:


那么在实际的计算中,将r区域内的像素点坐标x,y代入公式即可得到其应赋予的权值。
这种模糊算法就叫做高斯模糊。

模糊算法的具体实现比较多,网上有不少博客,这里就不再重现。
 
观察上面的模糊算法让人像脸部雀斑淡化,和肤色接近,有一种磨皮的效果,如果在处理图像的时候只处理这些较为平坦的区域,如脸部,额头,而对眼部,眉毛等细节多的地方保留,是不是就可以实现磨皮效果了呢?
我们在设计模糊算法时,可以对r区域内的不同位置的像素点赋予不同的权值(高斯模糊),那么要想保留细节,是否可以根据当前中心点与周围像素点颜色的差值赋予周围像素点不同大小的权重呢,根据细节多的地方模糊效果小,细节少的地方模糊效果大的原则,我们为与中心像素点颜色差值大的像素点赋予低权值,对于中心点颜色差异小的像素点赋予高权值:
脸部:因为是平坦区域,周围颜色相差小,权值赋值大,对中心点颜色影响大,经过计算后该区域颜色逐渐趋于一致
眼部睫毛:是崎岖区域,睫毛与周围皮肤色差极大,给周围像素点的权值极小,基本上不会对中心区域(睫毛黑)造成影响,因此黑色得以保留。
以此建立数学模型:
 
设中心点颜色值为X,模糊区域半径为r,周围像素点为X(i),模糊力度为Y,那么中心像素点计算结果是:
 
(图片来自网络)
因为每个像素点有四个分量,a,r,g,b分别代表透明度,红,绿,蓝,因此要对四个分量分别应用上面的公式。
可以看到,该方法复杂度与r有关,且成平方关系,因此耗时还是挺长的。以后有优化的余地。
 
保边模糊算法rs脚本:
 
#pragma version(1)// The java_package_name directive needs to use your Activity's package path
#pragma rs java_package_name(com.example.administrator.rs)// Store the input allocation
rs_allocation inputAllocation;int radius=0;
float weight=0;//权
uchar4 result=0;uchar4 __attribute__((kernel)) magnify(uchar4 in, int x, int y) {int total=(2*radius+1)*(2*radius+1);
float Rdenominator=0;
float Gdenominator=0;
float Bdenominator=0;
float Adenominator=0;
float Rmolecular=0;
float Gmolecular=0;
float Bmolecular=0;
float Amolecular=0;
int dx=-radius;
int dy=-radius-1;uchar4 cur= rsGetElementAt_uchar4(inputAllocation, x, y);for(int i=0;i<total;i++){
if(i%(2*radius+1)==0){
dx=-radius;
dy++;
}uchar4 sam= rsGetElementAt_uchar4(inputAllocation, x+dx, y+dy);float rRatio=fmax((float)0,1-abs(sam.r-cur.r)/weight);
float gRatio=fmax((float)0,1-abs(sam.g-cur.g)/weight);
float bRatio=fmax((float)0,1-abs(sam.b-cur.b)/weight);
float aRatio=fmax((float)0,1-abs(sam.a-cur.a)/weight);Rmolecular+=(rRatio*sam.r);
Gmolecular+=(gRatio*sam.g);
Bmolecular+=(bRatio*sam.b);
Amolecular+=(aRatio*sam.a);Rdenominator+=rRatio;
Gdenominator+=gRatio;
Bdenominator+=bRatio;
Adenominator+=aRatio;dx++;
}//forresult.r=min((float)255,Rmolecular/Rdenominator);
result.g=min((float)255,Gmolecular/Gdenominator);
result.b=min((float)255,Bmolecular/Bdenominator);
result.a=min((float)255,Amolecular/Adenominator);;
return result;
}
void init(){
}
 
中间的两个seekBar上边标识r,下面标识模糊力度。
下面用这套算法进行试验: 
第一张对比图:

第二张对比图:
 
 

第三张对比图:

总体来说实现了表面模糊。查阅资料发现商用的磨皮算法要分多次处理,表面模糊是其中最重要的一步保边滤波的一种实现方式,一般流程为:

1,保边滤波

2,肤色检测

3,图像融合

4,锐化

完整磨皮流程及其他的保边滤波实现以后有机会再说。

项目源码地址:git@github.com:gediseer/RenderScript.git

Android磨皮算法的实现 renderScript实现表面模糊相关推荐

  1. 选择性模糊及其算法的实现。

    选择性模糊及其算法的实现. 我们常见的模糊算法比如均值模糊.高斯模糊等其基本的过程都是计算一个像素周边的的某个领域内,相关像素的某个特征值的累加和及对应的权重,然后得到结果值.比如均值模糊的各像素的权 ...

  2. 深度学习AI美颜系列---AI美颜磨皮算法一

    深度学习AI美颜系列---AI美颜磨皮算法一 转自:https://blog.csdn.net/trent1985/article/details/80661230 首先说明一点,为什么本结内容是&q ...

  3. 计算机图形学 区域填充,计算机图形学 区域填充算法的实现

    . '. 实验四区域填充算法的实现班级 08信计学号 58 姓名陈瑞雪分数 一.实验目的和要求: 1.掌握区域填充算法基本知识 2.理解区域的表示和类型,能正确区分四连通和八连通的区域 3.了解区域填 ...

  4. OpenCV中图像旋转(warpAffine)算法的实现过程

    在OpenCV中,目前并没有现成的函数直接用来实现图像旋转,它是用仿射变换函数cv::warpAffine来实现的,此函数目前支持4种插值算法,最近邻.双线性.双三次.兰索斯插值,如果传进去的参数为基 ...

  5. JAVA实现中点画线_实验1-中点画线和Bresenham画线算法的实现

    <实验1-中点画线和Bresenham画线算法的实现>由会员分享,可在线阅读,更多相关<实验1-中点画线和Bresenham画线算法的实现(9页珍藏版)>请在人人文库网上搜索. ...

  6. python边缘检测代码_python Canny边缘检测算法的实现

    图像边缘信息主要集中在高频段,通常说图像锐化或检测边缘,实质就是高频滤波.我们知道微分运算是求信号的变化率,具有加强高频分量的作用.在空域运算中来说,对图像的锐化就是计算微分.对于数字图像的离散信号, ...

  7. 干货回顾丨TensorFlow四种Cross Entropy算法的实现和应用

    交叉熵介绍 交叉熵(Cross Entropy)是Loss函数的一种(也称为损失函数或代价函数),用于描述模型预测值与真实值的差距大小,常见的Loss函数就是均方平方差(Mean Squared Er ...

  8. C++基础代码--20余种数据结构和算法的实现

    C++基础代码--20余种数据结构和算法的实现 过年了,闲来无事,翻阅起以前写的代码,无意间找到了大学时写的一套C++工具集,主要是关于数据结构和算法.以及语言层面的工具类.过去好几年了,现在几乎已经 ...

  9. ML之SVM:基于Js代码利用SVM算法的实现根据Kaggle数据集预测泰坦尼克号生存人员

    ML之SVM:基于Js代码利用SVM算法的实现根据Kaggle数据集预测泰坦尼克号生存人员 目录 实验数据 设计思路​ 实现代码(部分代码) 实验数据 设计思路 实现代码(部分代码) /**js代码实 ...

最新文章

  1. python分类预测_python做logistic分类预测尝试
  2. 【下班后学Android】Android开发环境搭建
  3. 速修复!开源 IT 基础设施管理解决方案 Salt 被曝多个严重漏洞
  4. ELF文件加载与动态链接(一)
  5. VCenter 5.5 数据库过大造成的问题和解决方法
  6. 中国互联网的那些事——二十年回顾
  7. 计算机网络体系结构与数据通信(一) 概述
  8. html 下拉框设置提示语,为 Html 的 Select 加一个提示语和输入方法
  9. linux samba 拒绝访问,Samba拒绝访问的解决方式
  10. 百度笔试题——页面调度算法
  11. html微信分享没有图片不显示,微信分享网页链接缩略图不显示解决方法
  12. Ablation study消融实验
  13. Python 基于Rawpy 索尼A73 RAW文件转为JPG功能实现
  14. 解决浏览器下载文件时中文文件名乱码的问题
  15. 国赛分区赛awd赛后总结-安心做awd混子
  16. 小白如何学习操作系统?
  17. 20个基于 WordPress 搭建的精美网站
  18. Android Studio 飞机大战
  19. C语言中union与struct的区别及sizeof的计算方式
  20. PL2303HXD电路图(USB转UART)

热门文章

  1. 论目前最好的中文搜索引擎
  2. 基于典型相关性分析(CCA)的多视图学习方法综述
  3. 图层样式之:内发光、外发光
  4. String类菜鸟级教程(字符串常量池及不可变,StringBuffer 和 StringBuilder)
  5. SpringBoot 整合 EasyExcel 数据写入Excel 合并单元格
  6. android+动态光圈效果,OpenGL Shader实例分析(8)彩色光圈效果
  7. web端安全测试工具
  8. iQQ 基于WebQQ3.0协议Java开发 跨平台QQ客户端
  9. 数睿数据深度 | 中国软件网对话数睿数据总裁刘超:深挖数据驱动、企业级无代码
  10. 安装openKylin 开源操作系统 (ubuntukylin-22.04-pro-amd64.isowindows版)