cra*_*per 5 android bitmap blur
我正在努力使用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
Run Code Online (Sandbox Code Playgroud)
我的问题是我真的不确定如何以有效的方式将其与我的Bitmap相乘.
我应该通过每个像素和
image.getPixel(x, y)
Run Code Online (Sandbox Code Playgroud)
同时将这些值存储到一个新数组(所以我不必一遍又一遍地获取这些值),然后遍历数组,并为每个值加上周围的值乘以内核中的相应字段除以1068 (在上述内核的情况下(=所有条目总结))?
有没有更好的方法来做到这一点?边界有一个简单的解决方案吗?
或者在我错过的Android SDK中是否有可用的东西?
你所做的基本上是原始图像 I 和内核 K 之间的 2D 卷积(内核实际上是 PSF - 点扩散函数)。如果图像 I 的大小为m x n,内核的大小为r x s,则对于模糊图像 J 的每个点,您需要进行 rxs 乘法,从而得到m x n x r x s整个图像的总乘法。
计算上更有效的方法是使用 DFT(离散傅立叶变换)。对图像和内核进行变换,并在变换域中将它们相乘,然后通过逆 DFT 恢复。简而言之:
J = IDFT(DFT(I)*DFT(K))
Run Code Online (Sandbox Code Playgroud)
对于 DFT 计算,存在快速算法(FFT - 快速傅里叶变换)。您可以在 Internet 上的 C 源代码中找到它们。为了使用C源代码,您需要使用Android平台支持的JNI(Java Native Interface)。
关于边界,使用 DFT 时不会有任何问题,因为边界模糊是循环完成的(例如,左边界值也使用一些右边界值来计算)。
如果您正在使用可能分离的内核(二维内核表示为一维内核的外积),那么它会变得更加简单。2D 卷积可以表示为先在行上然后在列上的一维卷积(反之亦然)。使用 DFT 进行模糊处理也是如此。
| 归档时间: |
|
| 查看次数: |
4994 次 |
| 最近记录: |