如何使用python在图像中找到区域边界?

时间:2015-08-27 11:15:26

标签: python image numpy boundary

所以我有两个numpy数组 - 第一个是3D RGB图像。第二个是表示图像中区域的2D网格(我的图像通常有大约7到20个区域),其中每个区域用整数表示。

2D网格看起来像这样:

[
[0,0,0,1],

[0,0,1,1],

[2,2,2,2]
]

现在我想要做的是找到一个算法,告诉我区域边界的确切位置,所以我希望算法返回边界在区域0和1,1和2,2和1之间的索引,等

所以在这种情况下我会得到:

0和1之间的边界:[0,2] [1,1]

0到2之间的边界:[1,0] [1,1]

1和2之间的边界:[1,2] [1,3]

2 个答案:

答案 0 :(得分:2)

讨论可用于以编程方式检测区域之间边界的算法 您可以使用任何边缘检测器内核并将其应用于您的2D网格,以便在结果为零时水平或垂直检测差异,如果答案非零则两个像素都属于同一区域,那么您刚刚在这里找到了边界。 其中一个边缘探测器是索贝尔 索贝尔内核看起来像 [-1 0 1] [-1 0 1] [-1 0 1]

[-1 -1 -1 ] [ 0 0 0 ] [ 1 1 1 ]

这是一个在python< opencv

中使用sobel的例子
https://li8bot.wordpress.com/2014/08/07/opencvpythonpart3-image-gradients/

答案 1 :(得分:0)

以下算法用于列表中的列表,但我相信它可以轻松调整以使用numpy。我还没有使用numpy,因此我无法给你确切的答案。

def main():
    grid = [[0, 0, 0, 1],
            [0, 0, 1, 1],
            [2, 2, 2, 2]]

    borders = []


    '''
    It has the following format.
    ['Borders beetwen 0 and 1', [[0, 2], [0, 3]]]
    [0, 2] is coordinate of 0 and [0, 3] is coordinate of 1.
    '''
    for x in range(0, len(grid)-1):

        for y in range(0, len(grid[x])-1):

            if grid[x][y] != grid[x][y+1]:
                header = ['Borders beetwen %s and %s' %(str(grid[x][y]), str(grid[x][y+1]))]
                coords = [[x, y], [x, y+1]]
                header.append(coords)
                borders.append(header)

            else:
                pass

        if grid[x][y] != grid[x+1][y]:
            header = ['Borders beetwen %s and %s' %(str(grid[x][y]), str(grid[x+1][y]))]
            coords = [[x, y], [x+1, y]]
            header.append(coords)
            borders.append(header)

        else:
            pass

    for element in borders:
        print(element)


if __name__ == '__main__':
    main()