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轴为权重,可以用二维高斯函数来建立数学模型:
(图片来自百度图片)