我正在努力使用Android模糊Bitmaps。
我已经看到很多关于使用像
这样的简单内核的信息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
我的问题是我真的不确定如何以有效的方式将其与我的Bitmap相乘。
我应该浏览每个像素吗?
image.getPixel(x, y)
同时将这些值存储到一个新数组(所以我不必一遍又一遍地获取这些值),然后遍历数组并为每个值加上周围的值乘以内核中的相应字段除以1068(在上述内核的情况下(=所有条目总结))?
有没有更好的方法呢?边界有一个简单的解决方案吗?
或者我错过的Android SDK中是否有可用的东西?
答案 0 :(得分:4)
你所做的基本上是原始图像I和内核K之间的2D卷积(内核实际上是PSF - 点扩散函数)。如果您的图片大小为m x n
,内核大小为r x s
,则对于每个模糊图像J点,您需要进行rxs乘法运算,从而导致整个图像的总共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时没有问题,因为边框处的模糊是圆形的(例如,左边框值也使用一些右边框值计算)。
如果您正在处理可能被分离的内核(2D内核表示为1-D内核的外部产品),那么它将变得更加简单。 2D卷积可以表示为行上的1-D卷积,然后是列(或反之亦然)。使用DFT进行模糊也是如此。
答案 1 :(得分:1)