所以我有两个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]
答案 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()