Java实现图像的高斯模糊滤镜

gaussianblurfiltertest

继续研究那本《Java动画、图形和极富客户端效果开发》,下午到现在搞的东西,高斯模糊滤镜,其原理(高斯分布)可以用一个矩阵方程来表示:

gaussian-formula

这个公式中,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(){}
}

源代码(Eclipse工程)&可执行JAR

One Response

Leave a Comment

(Necessary)

(Necessary, will not be published)

Please note: Comment moderation is enabled and may delay your comment. There is no need to resubmit your comment.