# Fast adjacency matrix computation from watershed

I would like to know if there is a faster way, than what I have done below, to compute the region adjacency matrix from a watershed image.

Input: watershed image with N regions labeled from 1 to N.

Output: adjacency matrix of these N regions.

1. For each region, compute the corresponding mask and put all masks into a vector:

vector<Mat> masks;
for(int i = 0; i < N; i++ )
{

// Dilate to overlap the watershed line (border)

}


2. Define a function to check if two regions are adjacent:

bool areAdjacent(const Mat& mask1, const Mat& mask2)
{
// Get the overlapping area of the two masks
Mat m;

// Compute the size of the overlapping area
int size = countNonZero(m);

// If there are more than 10 (for example) overlapping pixels, then the two regions are adjacent
return (size > 10);
}


3. Compute the adjacency matrix M: if the i-th region and the j-th region are adjacent, then M[i][j] = M[j][i] =1, otherwise they are equal to 0.

Mat M = Mat::zeros(N, N, CV_8U);
for(int i = 0; i < N-1; i++)
{
for(int j = i+1; j < N; j++)
{
{
M.at<uchar>(i,j) = 1;
M.at<uchar>(j,i) = 1;
}
}
}
return M;

edit retag close merge delete