边缘检测值sobel算子

sobel算子的在x方向是简单的三行箱式平滑滤波器,在y方向是包含三列的平滑滤波器。

Hx={-1,0,1,-2,0,2,-1,0,1}

Hy={-1,-2,-1,0,0,0,1,2,1};


案例:

activity:

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);
    }
   
    
    //边缘检测sobel算子
    public void remove(View v){
        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];
        int[] hx={-1,0,1,-2,0,2,-1,0,1};
        int[] hy={-1,-2,-1,0,0,0,1,2,1};
        bitmap.getPixels(pixel, 0, width, 0, 0, width, height);
        for(int y=0;y<height;y++){
            for(int x=0;x<width;x++){
                int a=pixel[y*width+x]>>24&0xff;
                int sumredx=0;
                int sumgreenx=0;
                int sumbluex=0;
                int sumredy=0;
                int sumgreeny=0;
                int sumbluey=0;
                int index=0;
                int sumred=0;
                int sumgreen=0;
                int sumblue=0;
                for(int i=-1;i<=1;i++){
                    int newi=y+i;
                    if(newi<0 ||newi>=height){
                        newi=0;
                    }
                    for(int j=-1;j<=1;j++){
                        int newj=x+j;
                        if(newj<0 ||newj>=width){
                            newj=0;
                        }
                        int red=pixel[newi*width+newj]>>16&0xff;
                        int green=pixel[newi*width+newj]>>8&0xff;
                        int blue=pixel[newi*width+newj]&0xff;
                        sumredx+=hx[index]*red;
                        sumgreenx+=hx[index]*green;
                        sumbluex+=hx[index]*blue;
                        
                        sumredy+=hy[index]*red;
                        sumgreeny+=hy[index]*green;
                        sumbluey+=hy[index]*blue;
                        index++;
                    }
                }
                sumred=(int)Math.sqrt(sumredx*sumredx+sumredy*sumredy);
                sumgreen=(int)Math.sqrt(sumgreenx*sumgreenx+sumgreeny*sumgreeny);
                sumblue=(int)Math.sqrt(sumbluex*sumbluex+sumbluey*sumbluey);
                
                outpixel[y*width+x]=judge(a)<<24|judge(sumred)<<16|judge(sumgreen)<<8|judge(sumblue);
            }
        }
        Bitmap newBitmap=Bitmap.createBitmap(width, height,Config.RGB_565);
        newBitmap.setPixels(outpixel, 0, width,0, 0, width, height);
        destinationImage.setImageBitmap(newBitmap);
    }
    
    
    public int judge(int number){
        return number<0?0:((number>255?255:number));
    }
   


边缘检测的效果是:


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值