二值图像区域标记(修改程序或提供程序,不胜感激),急!
因为处理的需要,写了一个二值图像区域标记的程序,可以运行,但运行结果会报错,找不出原因,而且运行速度比较慢,请高手给予指正,或提供一个已完成的程序,急需,谢谢!!!
在二值图像中,相互联结的黑像素的集合成为一个(黑)区域。本程序通过对图像内每个区域进行标记操作,求得区域的数目。
采用8连通判别算法。
从左到右,从上到下,依次检测每个像素,如果发现某像素点像素值为0,则依次检测该点的右上、正上、左上及左前点共四个点的像素值,判断他们的连通性。
Graphics::TBitmap * Bitmap17;
Bitmap17=new Graphics::TBitmap;
Bitmap17->Assign(Image2->Picture->Graphic);
Bitmap17->Width=Image2->Picture->Width;
Bitmap17->Height=Image2->Picture->Height;
Bitmap17->PixelFormat =pf8bit;
Bitmap17->Palette=Image1->Picture->Bitmap->Palette;
int x_sign=0;
int m_temp=0;
int x_temp=0;
int y_temp=0;
long flag[500];
Byte *ptr17=new Byte;
int **Data_temp;
Data =new int *[Bitmap17->Height];
Data_temp=new int *[Bitmap17->Height];
for(int i=0;i<Bitmap17->Height-1;i++)
{
Data[i] =new int[Bitmap17->Width];
Data_temp[i] =new int[Bitmap17->Width];
}
for(int i=0;i<Bitmap17->Height-1;i++)
{
ptr17=(Byte *)Bitmap17->ScanLine[i];
for(int j=0;j<Bitmap17->Width-1;j++)
{
Data[i][j]=(int)(*(ptr17+j));
}
}
for(int i=3;i<Bitmap17->Height-4;i++)
{
for(int j=3;j<Bitmap17->Width-4;j++)
{
if(Data[i][j]==0)//若当前点为黑点
{
if(Data[i-1][j+1]==0)//右上
{
Data_temp[i][j]=Data_temp[i-1][j+1];
x_temp=Data_temp[i-1][j+1];
flag[x_temp]+=1;
if(Data[i][j-1]==0 && Data[i][j-1]!=x_temp)//左前
{
y_temp=Data_temp[i][j-1];
for(int m=1;m<Bitmap17->Height-2;m++)
{ for(int n=1;n<Bitmap17->Width-2;n++)
{
if(Data[m][n]==y_temp)
{
flag[y_temp]=0;
Data[m][n]=x_temp;
flag[x_temp]+=1;
}
}
}
}//end 左前
if(Data[i-1][j-1]==0 && Data[i-1][j-1]!=x_temp)
{
y_temp=Data_temp[i-1][j-1];
for(int m=1;m<Bitmap17->Height-2;m++)
{ for(int n=1;n<Bitmap17->Width-2;n++)
{
if(Data[m][n]==y_temp)
{
flag[y_temp]=0;
Data[m][n]=x_temp;
flag[x_temp]+=1;
}
}
}
}//end 左上
}
else if(Data[i-1][j]==0)//正上
{
Data_temp[i][j]=Data_temp[i-1][j];
x_temp=Data_temp[i-1][j];
flag[x_temp]+=1;
}
else if(Data[i-1][j-1]==0)//左上
{
Data_temp[i][j]=Data_temp[i-1][j-1];
x_temp=Data_temp[i-1][j-1];
flag[x_temp]+=1;
}
else if(Data[i][j-1]==0)//左前
{
Data_temp[i][j]=Data_temp[i][j-1];
x_temp=Data_temp[i][j-1];
flag[x_temp]+=1;
}
else//没有
{
++x_sign;
m_temp=x_sign;
Data_temp[i][j]=m_temp;
flag[m_temp]=1;
}
}//end if
} //end for
} //end for
int fg[255]={0};
int y_sign=0;
for(int i=0;i<=x_sign;i++)
{
if(flag[i]!=0)
{
if(fg[y_sign]==0)
{
fg[y_sign]=flag[i];
++y_sign;
}
}
}
Button3->Caption=y_sign;
for(int i=1;i<Bitmap17->Height-2;i++)
{
ptr17=(Byte *)Bitmap17->ScanLine[i];
for(int j=1;j<Bitmap17->Width-2;j++)
{
*(ptr17+j)=(Byte)Data[i][j];
}
}
Image2->Picture->Graphic=Bitmap17;
delete Bitmap17;
delete Data;
请高手指正!谢谢!