Нахождение самой левой и самой правой ячейки, которая является Истиной в 2d-списке логических значений (Python) - PullRequest
0 голосов
/ 25 января 2019

У меня есть 2d-массив (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?

Ответы [ 3 ]

0 голосов
/ 26 января 2019

Будет ли это работать для вас? не самый эффективный, но работает. Идея состоит в том, чтобы удалить все строки и столбцы, которые являются ложными, поэтому вы получите «обрезанную» цифру.

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
0 голосов
/ 26 января 2019
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

Примечания:

  • Я использовал 100 влево / вправо, если в строке вообще нет True.
  • Если существует вероятность того, что значение True вообще не будет во всей матрице, условия для верха и низа должны быть слегка изменены.
  • :: - 1 повторяет список в обратном порядке
  • any проверяет наличие ненулевого / пустого / ложного значения.
  • min проверяет минимальное значение списка
  • [...] называется спискомпонимание, если вы хотите узнать больше об этом

С вашими значениями я получаю:

left:
14
right:
8
top:
4
bottom:
0
0 голосов
/ 25 января 2019

Вы можете использовать функцию index, которая возвращает первый индекс искомого значения:

, например

array = ([False, False, True, True, False])
print(array.index(True))

Возвращает

2

Вы можете повернуть массив, чтобы найти последний, добавив:

array.reverse();
print(array.index(True))

Что возвращает

1

Однако реверс - это очень дорогая операция для того, что вам нужно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...