膨胀和腐蚀是形态学滤波器中的两个基本操作之一。本文选用的操作矩阵是3x3的。
当8邻域中有一个像素是前景颜色是,那么就将中心像素设置为前景颜色,否则不变。案例中背景颜色是白色
前景颜色是黑色。
activity:
//对二值图像膨胀
public void remove(View v){
Bitmap bitmap=BitmapFactory.decodeResource(getResources(),R.drawable.i);
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==0 && green==blue){
flag=true;
break;
}
}
}
if(flag){
break;
}
}
if(flag){
red=green=blue=0;
}else{
red=green=blue=255;
}
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);
}
效果图:
下面利用二值图像的膨胀后的图像减去原始图像就可以得到边缘图像。
//利用二值图膨胀得到边缘图
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==0 && green==blue){
flag=true;
break;
}
}
}
if(flag){
break;
}
}
if(flag){
red=green=blue=0;
}else{
red=green=blue=255;
}
output[y*width+x]=a<<24|red<<16|green<<8|blue;
}
}
//output与input相减
int[] newpixel=new int[width*height];
for(int y=0;y<height;y++){
for(int x=0;x<width;x++){
int src=input[y*width+x];
int dst=output[y*width+x];
if(dst-src==0){
newpixel[y*width+x]=Color.WHITE;
}
if(dst-src<0){
newpixel[y*width+x]=Color.BLACK;
}
}
}
Bitmap newBitmap=Bitmap.createBitmap(width, height,Config.RGB_565);
newBitmap.setPixels(newpixel, 0, width, 0, 0, width, height);
destinationImage.setImageBitmap(newBitmap);
}
得到的效果图: