请问关于连通域面积的算法,急!

shanti 2003-08-19 08:58:29
加精
欢迎与我联系讨论
loisyan@sohu.com
...全文
246 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
shanti 2003-08-26
  • 打赏
  • 举报
回复
谢谢你,我试试:)
wrcluomo 2003-08-22
  • 打赏
  • 举报
回复
递归就不要做了,对大图不行,老是溢出。
//递归标号法递归程序
///////////////////////////////////////////////////////////////
void CCh1_1View::Search_biao(int x, int y)
//lWidth,lHeight为图像宽,高,x,y为所检测的像素所在的行列,lLineBytes为图像每行的字节数,lpDIBBits为指像图像像素起始位置的指针,
//lpdest=malloc(lHeight*lWidth)为指向所分置内存的指针,count为图像像素的标号。
{
static unsigned char* lpSrc;
lpSrc= new unsigned char;
lpSrc = (unsigned char*)lpDIBBitss + lLineBytes * (g_height - 1 - y) + x;
if (*lpSrc==0&&lpdest[g_width*(y-1)+x]==(unsigned char)0)
{
lpdest[g_width*(y-1)+x]=(unsigned char )count;
}
else
{
return;
delete lpSrc;
}

if(x-1>=1)
Search_biao(x-1, y);
if(x+1<g_width-1)
Search_biao(x+1, y);
if(y-1>=1)
Search_biao(x, y-1);
if(y+1<g_height-1)
Search_biao(x, y+1);


}
///////////////////////////////////////////////////////////////
//递归标号法主程序
///////////////////////////////////////////////////////////////
void CCh1_1View::OnSearchBiao()
{
CDC * pdc = GetDC();
// 获取文档
CCh1_1Doc* pDoc = GetDocument();
// 指向DIB的指针
LPSTR lpDIB;
// 指向DIB象素指针
LPSTR lpDIBBits;
// 锁定DIB
lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());
// 更改光标形状
BeginWaitCursor();
// 找到DIB图像象素起始位置
lpDIBBits = ::FindDIBBits(lpDIB);
unsigned char* lpSrc;
int i,j;
//CDC *ppdc=GetDC();
// 图像每行的字节数
LONG lLineBytes;
int lWidth,lHeight;
lWidth=::DIBWidth(lpDIB);
lHeight=::DIBHeight(lpDIB);
// 计算图像每行的字节数
lLineBytes = WIDTHBYTES(lWidth * 8);
lpdest=new unsigned char[g_height*g_width];
for(i=0;i<g_height*g_width;i++)//将分配的新内存其值全部高为0
*(lpdest+i)=(unsigned char)0;
////////////////////////////////////////////////////
for(j=1;j<g_height-1;j++)
for(i=1;i<g_width-1;i++)
{
lpSrc = (unsigned char*)lpDIBBits + lLineBytes * (g_height - 1 - j) + i;
if (*lpSrc==0&&lpdest[g_width*(j-1)+i]==(unsigned char)0)
{

count+=1;
Search_biao(i, j);

}
}
int t;
int *area;
area= new int [count+1];
for(i=0;i<count+1;i++)
area[i]=0;

for(i=1;i<g_width-1;i++)
for(j=1;j<g_height-1;j++)

for(t=0;t<count+1;t++)
{
if((int)lpdest[g_width*(j-1)+i]==t)
area[t]+=1;

}

for(i=1;i<g_width-1;i++)
for(j=1;j<g_height-1;j++)
{
for(t=0;t<count+1;t++)
if (area[t]<200&&(int)lpdest[g_width*(j-1)+i]==t)
*((unsigned char*)lpDIBBits + lLineBytes * (g_height - 1 - j) + i)=255;
}

// 恢复光标
EndWaitCursor();
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
//::free(lpdest);
delete lpdest;
delete area;
pDoc->UpdateAllViews(NULL);


}
///////////////////////////////////////////
/////////////////////////////////////
希望你能改好。
shanti 2003-08-22
  • 打赏
  • 举报
回复
递归标记如何做呢?
我现在这种方法可以计算面积了,还不知道是否正确,还有就是,速度的确很慢
wrcluomo 2003-08-22
  • 打赏
  • 举报
回复
标记法不行。速度慢,对复杂图形不效果不好。我以前试过。递归标记还行,但对大图像堆溢出。
shanti 2003-08-22
  • 打赏
  • 举报
回复
我采用对连通域做标记的方法,现在在做修改,还没有实现
shanti 2003-08-21
  • 打赏
  • 举报
回复
请说清楚些,链表法如何实现呢?
wrcluomo 2003-08-21
  • 打赏
  • 举报
回复
我知道有一个链表法,就是把边界跟踪下来,对边界点排序,然后扫描这个区域,扫描过的换成别的颜色。
wrcluomo 2003-08-21
  • 打赏
  • 举报
回复
给你发过去,得自己整理,你有什么算法,希望交流。不是一句两句说清的。
shanti 2003-08-20
  • 打赏
  • 举报
回复
如果在图像中有许多物体,我希望可以计算面积并加以统计来区分想要的物体和不想要的物体,该如何计算不同的物体的面积?
寻开心 2003-08-20
  • 打赏
  • 举报
回复
支持HUNTON
wtzmax 2003-08-20
  • 打赏
  • 举报
回复
................
种子填充算法用来在封闭曲线形成的环中填充某中颜色,在这里我们只填充黑色。
种子填充其实上是图形学中的算法,其原理是:准备一个堆栈,先将要填充的点push进堆栈中;以后,每pop出一个点,将该点涂成黑色,然后按左上右下的顺序查看它的四个相邻点,若为白(表示还没有填充),则将该邻点push进栈。一直循环,直到堆栈为空。此时,区域内所有的点都被涂成了黑色。
................
HUNTON 2003-08-20
  • 打赏
  • 举报
回复
如果知道区域边界点就用这个方法吧:
我们都知道已知A(x1,y1)B(x2,y2)C(x3,y3)三点的面积公式为
|x1 x2 x3|
S(A,B,C) = |y1 y2 y3| * 0.5 (当三点为逆时针时为正,顺时针则为负的)
|1 1 1 |

对多边形A1A2A3、、、An(顺或逆时针都可以),设平面上有任意的一点P,则有:
S(A1,A2,A3,、、、,An)
= abs(S(P,A1,A2) + S(P,A2,A3)+、、、+S(P,An,A1))

P是可以取任意的一点,用(0,0)就可以了。


还有一个方法:
任意一个简单多边形,当它的各个顶点位于网格的结点上时,它的面积数S=b/2+c+1
其中:b代表该多边形边界上的网络结点数目
c代表该多边形内的网络结点数目

所以把整个图形以象素为单位可以把整个图形分成若干个部分,计算该图形边界上的点b和内部的点c就得到面积数S了,然后把S乘以一个象素的面积就是所求的面积了。
wtzmax 2003-08-20
  • 打赏
  • 举报
回复
种子填充,计算种子数
shanti 2003-08-20
  • 打赏
  • 举报
回复
我看到有一种:lumia算法,不知道是怎么样的一种算法?
eastsun 2003-08-20
  • 打赏
  • 举报
回复

dots.

4,445

社区成员

发帖
与我相关
我的任务
社区描述
图形图像/机器视觉
社区管理员
  • 机器视觉
  • 迪菲赫尔曼
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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