【发布时间】:2014-03-30 07:17:20
【问题描述】:
我有这段代码用于在二进制图像中查找所有连接的组件,以及该组件中的像素总数。
int isSafe(unsigned char *M, int row, int col, bool visited[][COL])
{
return (row >= 0) && (row < ROW) && (col >= 0) && (col < COL) &&
(M[row*ROW + col] && !visited[row][col]);
}
void DFS(unsigned char *M, int row, int col, bool visited[][COL])
{
indexes.push_back(count_elements);//
indexes.at(count_elements)= ((row+1)*ROW + col+1);
++count_elements;
//add index positions to array or vector
static int rowNbr[] = {-1, -1, -1, 0, 0, 1, 1, 1};
static int colNbr[] = {-1, 0, 1, -1, 1, -1, 0, 1};
visited[row][col] = true;
for (int k = 0; k < 8; ++k)
if (isSafe(M, row + rowNbr[k], col + colNbr[k], visited) )
{
DFS(M, row + rowNbr[k], col + colNbr[k], visited);
}
}
int countComponents(unsigned char *M)
{
bool visited[ROW][COL];
memset(visited, 0, sizeof(visited));
for (int i = 0; i < ROW; ++i)
for (int j = 0; j < COL; ++j)
if (M[i*ROW + j] && !visited[i][j])
{
//indexes.clear();
count_elements=0;
DFS(M, i, j, visited);
elements[count] = count_elements;
++count;
}
/*for (int i = 1; i < ROW; ++i)
{
if(elements[0]<elements[i])
elements[0] = elements[i];
}*/
//printf("%d ", elements[0]);
return count;
}
M 是尺寸为 512x512 的图像。 elements[] 存储每个连接组件中的像素总数,索引向量存储连接像素的索引。如果任何连接组件中的像素总数小于 3200(大约),则上述代码工作正常。但是,如果此值大于 3200,则此代码不起作用。请帮帮我。
【问题讨论】:
-
M[row*ROW + col]- 这件事就在这里:如果我做对了,该函数应该检查行/列像素是否在 M 矩阵内。如果你传递矩阵外一个点的函数坐标,它会给你一个访问冲突。 -
@tsuki 这个检查是
isSafe应该做的。 -
@Gaurav 请发布您的complete 代码。看来您正在使用上面未显示定义的全局变量,特别是
indexes、elements、count_elements、count。 -
@Gaurav 这可能是堆栈溢出问题。组件大小为 3200 意味着递归深度为 3200。如果是这种情况,则 DFS 递归在这里不合适。我会在disjoint set 上推荐联合查找算法。它不是递归的;你只遍历矩阵一次。而且效率更高。
-
@Gaurav 另外,这里不需要 8 连接。 4-连通性就足够了。如果您实现联合查找,您只需通过矩阵一次,并且在每个位置您只考虑两个邻居,一个在上面,一个在左边。无论如何,下面和右边的内容将在以后检查。
标签: c++ image-processing