我有一个二维数组(28 x 28),具有布尔值。
array([[False, False, False, False, False, False, False, False, False,
False, False, False, False, False, False, False, False, False,
False, False, False, False, False, False, False, False, False,
False],
[False, False, False, False, False, False, False, False, False,
False, False, False, False, False, False, False, False, False,
False, False, False, False, False, False, False, False, False,
False],
[False, False, False, False, False, False, False, False, False,
False, False, False, False, False, False, False, False, False,
False, False, False, False, False, False, False, False, False,
False],
[False, False, False, False, False, False, False, False, False,
False, False, False, False, False, False, False, False, False,
False, False, False, False, False, False, False, False, False,
False],
[False, False, False, False, False, False, False, False, False,
False, False, False, False, False, False, False, True, True,
True, False, False, False, False, False, False, False, False,
False],
[False, False, False, False, False, False, False, False, False,
False, False, False, False, False, False, True, True, True,
True, True, False, False, False, False, False, False, False,
False],
[False, False, False, False, False, False, False, False, False,
False, False, False, False, False, True, True, True, True,
True, True, False, False, False, False, False, False, False,
False],
...
这代表一个数字的图像。为了拉伸此图像,以使墨水像素的水平和垂直范围处于框的整个水平/垂直范围。
以下是我要采取的步骤:
1. Find the leftmost (x_min) and the rightmost (x_max) pixels that have ink (after thresholding).
2. Find the topmost (y_min) and bottom-most (y_max) pixels similarly.
3. Find the centerpoint (x,y) by taking the mean of x_min and x_max and y_min and y_max respectively.
4. Now, the 20x20 bounding is defined as img[y_center-10 : y_center + 10, x_center-10:x_center+10]
我尝试以天真的方式来做Step 1
,只是迭代所有像素,但是我知道那不是最好的方式。找到最左边和最右边的像素True
的最佳方法是什么?
答案 0 :(得分:0)
您可以使用函数索引,该函数返回您搜索的值的第一个索引:
例如
array = ([False, False, True, True, False])
print(array.index(True))
返回
2
您可以通过添加以下内容来反转数组以找到最后一个数组:
array.reverse();
print(array.index(True))
返回哪个
1
但是,反向操作非常昂贵,可以满足您的需求。
答案 1 :(得分:0)
这对您有用吗?并非最有效,但可行。 想法是删除全为False的行和列,这样您就可以得到“裁剪的”数字。
import pandas as pd
img = np.array([[False, False, False, False, False, False, False, False, False,
False, False, False, False, False, False, False, False, False,
False, False, False, False, False, False, False, False, False,
False],
[False, False, False, False, False, False, False, False, False,
False, False, False, False, False, False, False, False, False,
False, False, False, False, False, False, False, False, False,
False],
[False, False, False, False, False, False, False, False, False,
False, False, False, False, False, False, False, False, False,
False, False, False, False, False, False, False, False, False,
False],
[False, False, False, False, False, False, False, False, False,
False, False, False, False, False, False, False, False, False,
False, False, False, False, False, False, False, False, False,
False],
[False, False, False, False, False, False, False, False, False,
False, False, False, False, False, False, False, True, True,
True, False, False, False, False, False, False, False, False,
False],
[False, False, False, False, False, False, False, False, False,
False, False, False, False, False, False, True, True, True,
True, True, False, False, False, False, False, False, False,
False],
[False, False, False, False, False, False, False, False, False,
False, False, False, False, False, True, True, True, True,
True, True, False, False, False, False, False, False, False,
False]])
img = pd.DataFrame(img)
img.replace(False,np.nan, inplace = True)
newimage = img.dropna(axis = 0, how = 'all')
newimage = newimage.dropna(axis = 1, how = 'all')
newimage.T.values
答案 2 :(得分:0)
array = [[False, False, False, False],
[False, False, False, False],
[True , False, False, False],
[False, False, False, False]]
print('left: ')
print(min([x.index(True) if True in x else 100 for x in array]))
print('right: ')
print(min([x[::-1].index(True) if True in x else 100 for x in array]))
print('top')
print([any(x) for x in array].index(True))
print('bottom')
print([any(x) for x in array[::-1]].index(True))
打印
left:
0
right:
3
top
2
bottom
1
旁注:
any
检查是否存在非0 /空/ False值。min
检查列表的最小值有了您的价值观,我得到了:
left:
14
right:
8
top:
4
bottom:
0