高斯滤波之一维滤波

高斯滤波:

高斯滤波的解释:

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

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值