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));
}
边缘检测的效果是: