2010-09-09 59 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模糊也是如此。