2010-09-09 56 views
5

我很努力地使用Android来模糊位图。如何模糊位图(Android)?

我已经看到了很多有关使用一个简单的内核像

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我错过了什么?

+0

看到我的答案为Android的完整复制和粘贴快速位图模糊实施:http://stackoverflow.com/a/10028267/578746 – Yahel 2012-04-05 12:07:41

回答

4

你在做什么基本上是原始图像I和核K之间的二维卷积(内核实际上是PSF - 点扩散函数)。如果你的形象我是大小m x n,而内核是大小r x s的,对模糊图像的J每个点必须具备r个S乘法,导致合计m x n x r x s乘法整个图像。

在计算上更有效的方法是使用DFT(离散傅立叶变换)。对图像和内核进行变换,并将它们在变换域中相乘,然后通过逆DFT恢复。简而言之:

J = IDFT(DFT(I)*DFT(K)) 

对于DFT计算存在快速算法(FFT - 快速傅里叶变换)。你可以在Internet上的C源代码中找到它们。为了使用C源代码,您需要使用Android平台支持的JNI(Java Native Interface)。

关于边界,使用DFT当你有任何问题,因为在边界模糊完成循环(使用也有一些右边界值的计算例如左边框值)。

如果使用,其可以被分离(表示为1-d内核的外积2D内核)的内核工作,那么它变得更简单。二维卷积可以表示为在行上然后在列上的一维卷积(反之亦然)。使用DFT模糊也是如此。