Sat, Mar 7th, 2009
Java实现图像的高斯模糊滤镜
继续研究那本《Java动画、图形和极富客户端效果开发》,下午到现在搞的东西,高斯模糊滤镜,其原理(高斯分布)可以用一个矩阵方程来表示:
这个公式中,u是一个像素到中心的水平距离,v是一个像素到中心的垂直距离,σ(sigma)是标准偏差。标准偏差可以设置为任意的数,但是设置成半径的1/3会生成好的结果
看来要补充些线性代数的知识了 orz
我的高数课本都已经卖给二手书收购站了啊! orzorzorz
那么滤镜核心部分的代码见内页,测试用的代码部分就不贴了,感兴趣的点击文后的压缩包看源代码(Eclipse工程)&可执行JAR吧。
来自书本上的核心代码:
package cn.vifix.uilab; import java.awt.image.ConvolveOp; import java.awt.image.Kernel; public class GaussianBlurFilter { public static ConvolveOp getGaussianBlurFilter(int radius, boolean horizontal){ if (radius < 1){ throw new IllegalArgumentException("Radius must be >= 1"); } int size = radius * 2 + 1; float[] data = new float[size]; float sigma = radius / 3.0f; float twoSigmaSquare = 2.0f * sigma * sigma; float sigmaRoot = (float) Math.sqrt(twoSigmaSquare * Math.PI); float total = 0.0f; for(int i = -radius; i <= radius; i++){ float distance = i * i; int index = i + radius; data[index] = (float) Math.exp(-distance/twoSigmaSquare) / sigmaRoot; total += data[index]; } for(int i = 0; i < data.length; i++){ data[i] /= total; } Kernel kernel = null; if(horizontal){ kernel = new Kernel(size,1,data); } else{ kernel = new Kernel(1,size,data); } return new ConvolveOp(kernel, ConvolveOp.EDGE_NO_OP, null); } private GaussianBlurFilter(){} }


不是很懂,继续汗颜的低下了头