二值图像区域标记(修改程序或提供程序,不胜感激),急!

zdyyongjing 2005-04-19 12:44:29
因为处理的需要,写了一个二值图像区域标记的程序,可以运行,但运行结果会报错,找不出原因,而且运行速度比较慢,请高手给予指正,或提供一个已完成的程序,急需,谢谢!!!


在二值图像中,相互联结的黑像素的集合成为一个(黑)区域。本程序通过对图像内每个区域进行标记操作,求得区域的数目。
采用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;

请高手指正!谢谢!
...全文
372 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
icwin 2005-05-11
  • 打赏
  • 举报
回复
up
qiushenwei88 2005-04-21
  • 打赏
  • 举报
回复
学习
zdyyongjing 2005-04-21
  • 打赏
  • 举报
回复
Button3->Caption=y_sign;
这一句得出二值图像的区域数

或者也可以把程序中的此句:
*(ptr17+j)=(Byte)Data[i][j];
换成
*(ptr17+j)=(Byte)Data_temp[i][j];
这样可以以不同的灰度值显示各区域
icwin 2005-04-20
  • 打赏
  • 举报
回复
up
cbuilder211 2005-04-20
  • 打赏
  • 举报
回复
结果是什么?没看出来...(新手请见量)
zdyyongjing 2005-04-20
  • 打赏
  • 举报
回复
谢谢大家,程序我已改好,结果是正确的,粗心的原故,
程序如下:
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]={0};

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;i++)
{
Data[i] =new int[Bitmap17->Width];
Data_temp[i] =new int[Bitmap17->Width];
}

for(int i=0;i<Bitmap17->Height;i++)
{
ptr17=(Byte *)Bitmap17->ScanLine[i];
for(int j=0;j<Bitmap17->Width;j++)
{
Data[i][j]=(int)(*(ptr17+j));
}
}

for(int i=0;i<Bitmap17->Height;i++)
{

Data[i][Bitmap17->Width-1]=255;
Data[i][0]=255;

}

for(j=0;j<Bitmap17->Width;j++)
{

Data[0][j]=255;
Data[Bitmap17->Height-1][j]=255;

}


for(int i=1;i<Bitmap17->Height-1;i++)
{
for(int j=1;j<Bitmap17->Width-1;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_temp[i][j-1]!=x_temp)//左前
{
y_temp=Data_temp[i][j-1];
for(int m=1;m<Bitmap17->Height-1;m++)
{
for(int n=1;n<Bitmap17->Width-1;n++)
{
if(Data_temp[m][n]==y_temp)
{
flag[y_temp]=0;
Data_temp[m][n]=x_temp;
flag[x_temp]+=1;
}
}
}
}//end 左前
if(Data[i-1][j-1]==0 && Data_temp[i-1][j-1]!=x_temp)
{
y_temp=Data_temp[i-1][j-1];
for(int m=1;m<Bitmap17->Height-1;m++)
{
for(int n=1;n<Bitmap17->Width-1;n++)
{
if(Data_temp[m][n]==y_temp)
{
flag[y_temp]=0;
Data_temp[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[500]={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=0;i<Bitmap17->Height;i++)
{
ptr17=(Byte *)Bitmap17->ScanLine[i];
for(int j=0;j<Bitmap17->Width;j++)
{
*(ptr17+j)=(Byte)Data[i][j];
}
}
Image2->Picture->Graphic=Bitmap17;
for(int i=0;i<Bitmap17->Height;i++)
{
delete[] Data[i];
delete[] Data_temp[i];
}
delete[] Data;
delete[] Data_temp ;
delete Bitmap17;

再一次感谢各位网友的支持与关注!谢谢!
constantine 2005-04-19
  • 打赏
  • 举报
回复
我加上些必要的没有错,不过代码的结果错误
y_sign一直为1
arney 2005-04-19
  • 打赏
  • 举报
回复
vc++ 图像处理程序设计上有类似的
cczlp 2005-04-19
  • 打赏
  • 举报
回复
什么错误?非法访问?
速度慢主要是应该优化算法的思想,优化代码不会有多大效果
zdyyongjing 2005-04-19
  • 打赏
  • 举报
回复
谢谢constantine(飘遥的安吉儿),因为只考虑到程序的功能实现,所以收尾的工作就没细心考虑

我有一个VC的二值化区域标记程序,可执行,速度爆快,是爆快,可是那个程序,太复杂了,我没看懂它的算法
constantine 2005-04-19
  • 打赏
  • 举报
回复
起码有内存泄漏没有处理
for(int i=0;i<Bitmap17->Height;i++)
{
delete[] Data[i];
delete[] Data_temp[i];
}
delete[] Data;
delete[] Data_temp ;
delete Bitmap17;
最后要这样才可以
zdyyongjing 2005-04-19
  • 打赏
  • 举报
回复
zdyyongjing@163.com
QQ:36908641

谢谢大家的关注。
NetSpider9804040 2005-04-19
  • 打赏
  • 举报
回复
帮你顶一下!
zdyyongjing 2005-04-19
  • 打赏
  • 举报
回复
Data是一个二维数组
int **Data;

谢谢关注!
happyct 2005-04-19
  • 打赏
  • 举报
回复
帮你UP一下
constantine 2005-04-19
  • 打赏
  • 举报
回复
Data 是什么东西,没有看到定义哦

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧