【问题标题】:How to find the number of blobs in a 2d matrix?如何找到二维矩阵中的斑点数?
【发布时间】:2015-08-27 10:16:41
【问题描述】:

如何找到二维矩阵中的 blob 数量?大小MxN

blob 是一个连续的X 像素块。其中矩阵包含XO

XOOOXO
OXOXOX
XXOOXO

我想使用 8-neighbourship(请参阅 here)。所以我希望在上面的例子中可以找到 2 个 blob。

【问题讨论】:

    标签: algorithm multidimensional-array neighbours


    【解决方案1】:

    这个想法很简单:标记每个连续的 blob 并计算标记了多少 blob。

    这里有一些伪代码(您没有指定编程语言)来帮助您入门:

    numBlobs = 0;
    foreach(item in matrix)
    {
        res = Visit(item);
        if(res > 0) 
        {
            numBlobs = numBlobs + 1;
        }
    }
    return numBlobs;
    

    访问函数/方法如下所示:

    Visit(item)
    {
        marked = 0;
        if(item.IsX() && !IsItemMarked(neighbour))
        {
            MarkItemAsVisited(item);
            marked = 1;
            foreach(neighbour in GetNeighbours(item))
            {
                marked = marked + Visit(neighbour);
            }
        }
        return marked;
    }
    

    您所要做的就是实现其他功能/方法,但它们非常简单。

    【讨论】:

    • 请用C给我,这样会更容易理解!
    • @AkshayAgarwal 请自己做,这将是一个好习惯。
    • 好的!还是非常感谢!
    • 我正在做这样的事情 inline 'char arr[10][10]; int blobCount=0; for(i=0;i0) { blobCount++; } } 返回 blobCount;'但我不明白访问方法。请帮忙。
    • 您需要将 i, j 传递给 Visit() 在您的情况下。如果有时间我会稍后发布更新...
    【解决方案2】:
    public static void main(String[] args) {
            int[][] matrix = new int[6][5];
            System.out.println(matrix.length);
            for (int i=0; i < matrix.length; i++) {
                for (int j=0; j < matrix[i].length; j++) {
                    matrix[i][j] = 0;
                }
            }
    
            matrix[0][3] = 1;
            matrix[1][1] = 1;
            matrix[1][3] = 1;
            matrix[2][1] = 1;
            matrix[2][2] = 1;
            matrix[2][3] = 1;
            matrix[4][0] = 1;
            matrix[4][4] = 1;
            matrix[5][2] = 1;
            matrix[5][3] = 1;
            matrix[5][4] = 1;
    
            System.out.println(findBlobCount(matrix, matrix.length, matrix[0].length));
        }
    
        static int findBlobCount (int matrix[][], int rowCount, int colCount)
        {
            int visited[][] = new int[rowCount][colCount]; // all initialized to false
    
            int count=0;
    
            for (int i=0; i<rowCount; i++)
            {
                for (int j=0; j<colCount; j++)
                {
                    if (matrix[i][j] == 1 && visited[i][j] == 0) // unvisited black cell
                    {
                        markVisited (i,j, matrix, visited, rowCount, colCount);
                        count++;
                    }
                }
            }
    
            return count;
        }
    
    
        static int markVisited (int i, int j, int [][]matrix, int [][]visited, int rowCount, int colCount)
        {
            if (i < 0 || j < 0)
                return 0;
    
            if (i >= rowCount || j >= colCount)
                return 0;
    
            if (visited[i][j] == 1) // already visited
                return 1;
    
            if (matrix[i][j] == 0) // not a black cell
                return 0;
    
            visited[i][j] = 1;
    
            // recursively mark all the 4 adjacent cells - right, left, up and down
            return  markVisited (i+1, j, matrix, visited, rowCount, colCount) 
                    + markVisited (i-1, j, matrix, visited, rowCount, colCount) 
                    + markVisited (i, j+1, matrix, visited, rowCount, colCount) 
                    + markVisited (i, j-1, matrix, visited, rowCount, colCount);
        }
    

    【讨论】:

      猜你喜欢
      • 2021-12-20
      • 2013-06-18
      • 2023-03-03
      • 2016-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-17
      • 2020-08-17
      相关资源
      最近更新 更多