如何在Android中对位图进行模糊处理?

5

我很难让Bitmap在Android上进行模糊处理。

我看到了很多关于使用简单内核(如高斯模糊)的信息,但是这些方法不能满足我的需求。我想要实现更强大的模糊效果,类似于Photoshop中的径向模糊、方向模糊和普通模糊。

0    0    0    5    0    0    0
0    5   18   32   18    5    0
0   18   64  100   64   18    0
5   32  100  100  100   32    5
0   18   64  100   64   18    0
0    5   18   32   18    5    0
0    0    0    5    0    0    0

我的问题是,我真的不确定如何以高效的方式将这个与我的位图相乘。 我应该遍历每个像素并且...
image.getPixel(x, y)

在将这些值存储到新数组中(以便不必一遍又一遍地获取这些值),然后遍历该数组,对于每个值,将周围的值相加,乘以内核中相应字段除以1068(在上述内核的情况下(=所有条目求和))?

有更好的方法吗?边框有简单的解决方案吗?

或者在Android SDK中我错过了什么可用的东西?


查看我的答案,其中包含了一个完整的Android快速位图模糊实现的复制粘贴代码:https://dev59.com/5nI95IYBdhLWcg3w-DH0#10028267 - Yahel
2个回答

4
您正在做的基本上是原始图像I和内核K之间的二维卷积(内核实际上是PSF-点扩散函数)。如果您的图像I的大小为m x n,内核的大小为r x s,则对于模糊图像J的每个点,您需要r x s次乘法,导致整个图像总共有m x n x r x s次乘法。
在计算上更有效的方法是使用DFT(离散傅里叶变换)。对图像和内核进行转换,并在转换域中将它们相乘,然后通过逆DFT恢复。简而言之:
J = IDFT(DFT(I)*DFT(K))

对于DFT计算,存在快速算法(FFT - 快速傅里叶变换)。您可以在互联网上找到它们的C源代码。为了使用C源代码,您需要使用Android平台支持的JNI(Java Native Interface)。
关于边界问题,在使用DFT时,您没有任何问题,因为边界模糊是通过循环完成的(例如,左边界值也使用一些右边界值进行计算)。
如果您正在使用可能被分离的内核(2D内核表示为1-D内核的外积),那么它就变得更简单了。 2D卷积可以表示为对行和列的1-D卷积(或反之亦然)。 使用DFT进行模糊处理也是如此。

1

我读到这只能模糊图像的边缘,而不能模糊整个图像。在尝试自己进行模糊处理之前,我在谷歌上搜索了很多,但最终失败了。;-) - crapper

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接