roberts算子分为x方向梯度算子和y方向梯度算子
hx={0,1,-1,0}
hy={-1,0,0,1}
使用roberts算子完成边缘检测:
activity:
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={0,1,-1,0};
int[] hy={-1,0,0,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 rx=0,gx=0,bx=0;
int ry=0,gy=0,by=0;
int red=0;
int green=0;
int blue=0;
int index=0;
for(int i=0;i<=1;i++){
for(int j=0;j<=1;j++){
int newi=y+i;
if(newi<0 || newi>=height){
newi=y;
}
int newj=x+j;
if(newj<0 ||newj>=width){
newj=x;
}
rx+=(pixel[newi*width+newj]>>16&0xff)*hx[index];
gx+=(pixel[newi*width+newj]>>8&0xff)*hx[index];
bx+=(pixel[newi*width+newj]&0xff)*hx[index];
ry+=(pixel[newi*width+newj]>>16&0xff)*hy[index];
gy+=(pixel[newi*width+newj]>>8&0xff)*hy[index];
by+=(pixel[newi*width+newj]&0xff)*hy[index];
index++;
}
}
red=(int)Math.sqrt(rx*rx+ry*ry);
green=(int)Math.sqrt(gx*gx+gy*gy);
blue=(int)Math.sqrt(bx*bx+by*by);
outpixel[y*width+x]=a<<24|clamp(red)<<16|clamp(green)<<8|clamp(blue);
}
}
Bitmap newBitmap=Bitmap.createBitmap(width, height,Config.RGB_565);
newBitmap.setPixels(outpixel, 0, width, 0, 0, width, height);
destinationImage.setImageBitmap(newBitmap);
}
得到的图像效果:
利用roberts算子完成边缘锐化的作用:
使用原始像素加上边缘检测所获得的像素数组就可以达到sharp filter的效果
//原像素与roberts算子相加
for(int y=0;y<height;y++){
for(int x=0;x<width;x++){
int a=pixel[y*width+x]>>24&0xff;
int red=(pixel[y*width+x]>>16&0xff)+(outpixel[y*width+x]>>16&0xff);
int green=(pixel[y*width+x]>>8&0xff)+(outpixel[y*width+x]>>8&0xff);
int blue=(pixel[y*width+x]&0xff)+(outpixel[y*width+x]&0xff);
pixel[y*width+x]=a<<24|clamp(red)<<16|clamp(green)<<8|clamp(blue);
}
}
得到的效果:
参考文章:http://blog.csdn.net/jia20003/article/details/7562092