高斯滤波:
高斯滤波的解释:
http://blog.csdn.net/jia20003/article/details/9156935
下面使用高斯滤波中的一维滤波达到滤波的效果
public class ImageJAndroid2Activity extends Activity {
ImageView sourceImage;
ImageView destinationImage;
float[] gaussianKeneral;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
sourceImage=(ImageView) findViewById(R.id.source);
destinationImage=(ImageView) findViewById(R.id.destination);
}
//二维高斯滤波分解为两个一维处理。
public void remove(View v){
gaussianKeneral=getGaussian(2,1);
Bitmap bitmap=BitmapFactory.decodeResource(getResources(),R.drawable.cc);
int width=bitmap.getWidth();
int height=bitmap.getHeight();
int[] pixel=new int[width*height];
int[] outpixel=new int[width*height];
bitmap.getPixels(pixel, 0, width, 0, 0, width, height);
blur(pixel,outpixel,width,height);
blur(outpixel,pixel,height,width);//两者的高宽顺序调了。
Bitmap newBitmap=Bitmap.createBitmap(width, height,Config.RGB_565);
newBitmap.setPixels(pixel, 0, width,0, 0, width, height);
destinationImage.setImageBitmap(newBitmap);
}
public void blur(int[] pixel,int[] outpixel,int width,int height){
for(int y=0;y<height;y++){
int index=y;
for(int x=0;x<width;x++){
//x方向的一维高斯
int a=pixel[y*width+x]>>24&0xff;
int sumred=0;
int sumgreen=0;
int sumblue=0;
for(int i=-2;i<=2;i++){
int subx=x+i;
if(subx<0 || subx>=width){
subx=0;
}
int red=pixel[y*width+subx]>>16&0xff;
int green=pixel[y*width+subx]>>8&0xff;
int blue=pixel[y*width+subx]&0xff;
sumred+=(int)(red*gaussianKeneral[i+2]);
sumgreen+=(int)(green*gaussianKeneral[i+2]);
sumblue+=(int)(blue*gaussianKeneral[i+2]);
}
outpixel[y*width+x]=a<<24|clamp(sumred)<<16|clamp(sumgreen)<<8|clamp(sumblue);
index+=height;
}
}
}
//获取高斯一维算子
public float[] getGaussian(int n,float sigma){
int size=2*n+1;
float[] gaussianKeneral=new float[size];
float sigma22=2*sigma*sigma;
float pi2=(float)Math.PI*2; //2pi
float sqrtpi2=(float)Math.sqrt(pi2)*sigma;
int index=0;
float sum=0f;
for(int i=-n;i<=n;i++){
float distance=i*i;
gaussianKeneral[index]=(float)Math.exp(-(distance)/sigma22)/sqrtpi2;
sum+=gaussianKeneral[index];
index++;
}
for(int i=0;i<size;i++){
gaussianKeneral[i]=gaussianKeneral[i]/sum;
}
return gaussianKeneral;
}
效果图:
如果大家对高斯二维滤波的代码感兴趣,请参看
http://blog.csdn.net/jia20003/article/details/7234741