二值图像的腐蚀过程与膨胀过程可以看成相逆的。
案例中任然采用的是3x3的矩阵,当8邻域的像素中有一个为背景色时,将中心像素设置为背景色,
否则不变。
activity:
//二值图像 的腐蚀
public void remove(View v){
Bitmap bitmap=BitmapFactory.decodeResource(getResources(),R.drawable.ii);
width=bitmap.getWidth();
height=bitmap.getHeight();
input=new int[width*height];
output=new int[width*height];
bitmap.getPixels(input, 0, width, 0, 0, width, height);
for(int y=0;y<height;y++){
for(int x=0;x<width;x++){
int a=input[y*width+x]>>24&0xff;
int red=0;
int green=0;
int blue=0;
boolean flag=false;
for(int i=-1;i<=1;i++){
for(int j=-1;j<=1;j++){
if(i!=0 && j!=0){
int newj=x+j;
if(newj<0 ||newj>=width){
newj=x;
}
int newi=y+i;
if(newi<0 ||newi>=height){
newi=y;
}
red=input[newi*width+newj]>>16&0xff;
green=input[newi*width+newj]>>8&0xff;
blue=input[newi*width+newj]&0xff;
//判断是否为背景色
if(red==255 && green==blue){
flag=true;
break;
}
}
}
if(flag){
break;
}
}
if(flag){
red=green=blue=255;
}else{
red=green=blue=0;
}
output[y*width+x]=a<<24|red<<16|green<<8|blue;
}
}
Bitmap newBitmap=Bitmap.createBitmap(width, height,Config.RGB_565);
newBitmap.setPixels(output, 0, width,0, 0, width, height);
destinationImage.setImageBitmap(newBitmap);
}
图像效果:
这里有个问题需要跟大家说下:
上面的3x3矩阵腐蚀,无法保证腐蚀之后的图像的连贯性,我们在腐蚀的时候可以自己来选择性的腐蚀以保证图像的连通性。
在后面的细化中会使用腐蚀并且会加以限制保证最后获取的单像素图像是连通的。