【发布时间】:2017-01-01 20:24:32
【问题描述】:
因此,我目前正在尝试找出一种更优化的解决方案来确定图像中的连接组件。目前,我有一个具有特定值的坐标数组。我想根据它们是否接触来创建这些坐标的组。我正在使用一个 numpy 数组,目前我必须检查每个值(左上、中上、右上、左中、右中、左下、中下、右下)是否在该数组中。我通过以下代码这样做:
for x in range (0, groupCoords.shape[0]):
global tgroup
xCoord = groupCoords.item((x,0))
yCoord = groupCoords.item((x,1))
new = np.array([[xCoord, yCoord]])
if np.equal(Arr,[xCoord, yCoord+1]).all(1).any():
tgroup = np.append(tgroup, [[xCoord,yCoord+1]], axis=0)
new = np.append(new, [[xCoord,yCoord+1]], axis=0)
index = np.argwhere((Arr == [xCoord,yCoord+1]).all(1))
Arr = np.delete(Arr, (index), axis=0)
if np.equal(Arr,[xCoord, yCoord-1]).all(1).any():
tgroup = np.append(tgroup, [[xCoord, yCoord-1]],axis=0)
new = np.append(new, [[xCoord,yCoord-1]], axis=0)
index = np.argwhere((Arr == [xCoord,yCoord-1]).all(1))
Arr = np.delete(Arr, (index), axis=0)
if np.equal(Arr,[xCoord+1, yCoord]).all(1).any():
tgroup = np.append(tgroup, [[xCoord+1,yCoord]],axis=0)
new = np.append(new, [[xCoord+1,yCoord]], axis=0)
index = np.argwhere((Arr == [xCoord+1,yCoord]).all(1))
Arr = np.delete(Arr, (index), axis=0)
if np.equal(Arr,[xCoord+1, yCoord+1]).all(1).any():
tgroup = np.append(tgroup, [[xCoord+1,yCoord+1]],axis=0)
new = np.append(new, [[xCoord+1,yCoord+1]], axis=0)
index = np.argwhere((Arr == [xCoord+1,yCoord+1]).all(1))
Arr = np.delete(Arr, (index), axis=0)
if np.equal(Arr,[xCoord+1, yCoord-1]).all(1).any():
tgroup = np.append(tgroup, [[xCoord+1,yCoord-1]],axis=0)
new = np.append(new, [[xCoord+1,yCoord-1]], axis=0)
index = np.argwhere((Arr == [xCoord+1,yCoord-1]).all(1))
Arr = np.delete(Arr, (index), axis=0)
if np.equal(Arr,[xCoord-1, yCoord]).all(1).any():
tgroup = np.append(tgroup, [[xCoord-1,yCoord]],axis=0)
new = np.append(new, [[xCoord-1,yCoord]], axis=0)
index = np.argwhere((Arr == [xCoord-1,yCoord]).all(1))
Arr = np.delete(Arr, (index), axis=0)
if np.equal(Arr,[xCoord-1, yCoord+1]).all(1).any():
tgroup = np.append(tgroup, [[xCoord-1,yCoord+1]],axis=0)
new = np.append(new, [[xCoord-1,yCoord+1]], axis=0)
index = np.argwhere((Arr == [xCoord-1,yCoord+1]).all(1))
Arr = np.delete(Arr, (index), axis=0)
if np.equal(Arr,[xCoord-1, yCoord-1]).all(1).any():
tgroup = np.append(tgroup, [[xCoord-1,yCoord-1]],axis=0)
new = np.append(new, [[xCoord-1,yCoord-1]], axis=0)
index = np.argwhere((Arr == [xCoord-1,yCoord-1]).all(1))
Arr = np.delete(Arr, (index), axis=0)
但是,如果图像很大,这显然会花费大量时间。我的想法是创建一个具有图像宽度和高度尺寸的布尔矩阵,然后将值“true”分配给矩阵中与图像中的像素相对应的值(图像是黑白的)。
我想知道,是否有可能不必像那样检查每个值,而是确定它们是否是直接围绕另一个“真”值的元素?
这是输入数组的样子:
[
[0 0]
[0 1]
[0 2]
[10 2]
]
输出看起来像
[
[0 0]
[0 1]
[0 2]
]
我希望改进的功能将检查“真实”值是否接触,并创建所有接触值的“网络”(它将继续运行找到的新值)。
【问题讨论】:
-
坐标顺序重要吗?我想我们正在过滤掉那里的坐标。您是否需要它们按照它们从一端连接到另一端的顺序(如果适用)或其他一些标准?
-
您能否举一个输入(例如 4x4 数组)和预期输出的小例子?
-
@Divakar 顺序无所谓,我只需要将它们分组到一个数组中。我将其用作 OCR 方法,因此它所做的是创建连接组件的列表,最终成为图像中的每个字符。
-
@WarrenWeckesser 我包含了一个示例输入。该函数将做的是获取数组中的坐标,例如 (1, 4)。然后它将直接检查旁边的值,并输出一个数组,该数组将为 [(0,4), (1,3), (1,5), (2,4), (2,5)]
-
谢谢。听起来这可能是实现的细节。你说你想“创建一个所有接触值的'网络'”,所以在更高层次上,说输入是布尔数组,输出是集合的集合(例如列表)是否正确坐标,每个连接组件的一个(外部)集合?例如。如果输入是
[[T, T, F, F], [F, F, F, T], [F, F, F, T]],则输出类似于[[(0, 0), (0, 1)], [(1, 3), (2, 3)]]?