最近在做一个图像识别方面的项目
以下是自己写的一个关于二值化图像连通域标记的代码
算法效率较高
编程容易
贴出来和大家分享一下!!
void ConnDomainMark (BYTE *p, int *pConnDomainMark, int *pMaxMarkValue, BYTE obj,
int width, int height, BYTE bitcount)
{
LONG LineBytes = (width + 3)/4*4;
CList <CPoint, CPoint> *pMarkSeedList;
pMarkSeedList = new CList <CPoint, CPoint>;
int i, j, temp;
int markvalue = 1000;
for (i=0; i<height; i++)
{
temp = i*LineBytes;
for (j=0; j<width; j++)
{
if ((obj == *(p + temp + j)) && (0 == *(pConnDomainMark + temp + j)))
{
markvalue++;
*(pConnDomainMark + temp + j) = markvalue;
CPoint pt(i, j);
pMarkSeedList->AddTail(pt);
}
while(!pMarkSeedList->IsEmpty())
{
int m, n;
m = ((CPoint)pMarkSeedList->GetHead()).x;
n = ((CPoint)pMarkSeedList->GetHead()).y;
//左
if ((n > 0) && (obj == *(p + m*LineBytes + n - 1)) && (0 == *(pConnDomainMark + m*LineBytes + n - 1)))
{
*(pConnDomainMark + m*LineBytes + n - 1) = markvalue;
CPoint pt(m, n-1);
pMarkSeedList->AddTail(pt);
}
//左上
if ((m > 0) && (n > 0) && (obj == *(p + (m-1)*LineBytes + n - 1)) && (0 == *(pConnDomainMark + (m-1)*LineBytes + n - 1)))
{
*(pConnDomainMark + (m-1)*LineBytes + n - 1) = markvalue;
CPoint pt(m-1, n-1);
pMarkSeedList->AddTail(pt);
}
//上
if ((m > 0) && (obj == *(p + (m-1)*LineBytes + n)) && (0 == *(pConnDomainMark + (m-1)*LineBytes + n)))
{
*(pConnDomainMark + (m-1)*LineBytes + n) = markvalue;
CPoint pt(m-1, n);
pMarkSeedList->AddTail(pt);
}
//右上
if ((m > 0) && (n < (width-1)) && (obj == *(p + (m-1)*LineBytes + n + 1)) && (0 == *(pConnDomainMark + (m-1)*LineBytes + n + 1)))
{
*(pConnDomainMark + (m-1)*LineBytes + n + 1) = markvalue;
CPoint pt(m-1, n+1);
pMarkSeedList->AddTail(pt);
}
//右
if ((n < (width-1)) && (obj == *(p + m*LineBytes + n + 1)) && (0 == *(pConnDomainMark + m*LineBytes + n + 1)))
{
*(pConnDomainMark + m*LineBytes + n + 1) = markvalue;
CPoint pt(m, n+1);
pMarkSeedList->AddTail(pt);
}
//右下
if ((m < (height-1)) && (n < (width-1)) && (obj == *(p + (m+1)*LineBytes + n + 1)) && (0 == *(pConnDomainMark + (m+1)*LineBytes + n + 1)))
{
*(pConnDomainMark + (m+1)*LineBytes + n + 1) = markvalue;
CPoint pt(m+1, n+1);
pMarkSeedList->AddTail(pt);
}
//下
if ((m < (height-1)) && (obj == *(p + (m+1)*LineBytes + n)) && (0 == *(pConnDomainMark + (m+1)*LineBytes + n)))
{
*(pConnDomainMark + (m+1)*LineBytes + n) = markvalue;
CPoint pt(m+1, n);
pMarkSeedList->AddTail(pt);
}
//左下
if ((m < (height-1)) && (n > 0) && (obj == *(p + (m+1)*LineBytes + n - 1)) && (0 == *(pConnDomainMark + (m+1)*LineBytes + n - 1)))
{
*(pConnDomainMark + (m+1)*LineBytes + n - 1) = markvalue;
CPoint pt(m+1, n-1);
pMarkSeedList->AddTail(pt);
}
pMarkSeedList->RemoveHead();
}
}
}
*pMaxMarkValue = markvalue;
return TRUE;
}