Поиск первой и последней строк, содержащих черный пиксель, в массиве numpy - PullRequest
0 голосов
/ 26 ноября 2018

У меня есть черно-белое изображение треугольника (оно содержит только значения 0 и 255 пикселей).

enter image description here

Я преобразовал егок массиву с именем myArray

В настоящее время я могу найти width нижней части треугольника (количество черных пикселей), используя этот код:

width = (max(numpy.where(myArray == 0)[1])) - (min(numpy.where(myArray == 0)[1]))

Если бы треугольник был перевернут вверх ногами, то width применился бы к вершине перевернутого треугольника.

Что я пытаюсь сделать, это определить, направлен ли треугольник вверх или вниз.

Я мог бы сделать это, найдя первую строку, содержащую черный пиксель, и посчитав количество черных пикселей в этой строке, вызвав это firstRow

и найдя последнюю строку, содержащуючерный пиксель и подсчитывает количество черных пикселей в этой строке, называя это lastRow

Затем, если firstRow < lastRow, треугольник направлен вверх.

Как лучше всего рассчитать firstRow и lastRow?

1 Ответ

0 голосов
/ 27 ноября 2018

С myArray с 255 для черного пикселя, например

array([[  0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.],
       [  0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.],
       [  0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.],
       [  0.,   0.,   0.,   0., 255.,   0.,   0.,   0.,   0.],
       [  0.,   0.,   0., 255., 255., 255.,   0.,   0.,   0.],
       [  0.,   0., 255., 255., 255., 255., 255.,   0.,   0.],
       [  0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.],
       [  0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.],
       [  0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.]])

, вы можете получить все строки с хотя бы одним черным пикселем с np.where после использования sum на axis=1:

print (np.where(myArray.sum(axis=1)))
(array([3, 4, 5], dtype=int64),)

Если вы хотите получить строку с максимальным количеством черных пикселей, вы можете использовать np.argmax все еще после sum при axis=1:

print (np.argmax(myArray.sum(axis=1)))
5

Чтобы узнатьесли треугольник вверх или вниз, один из способов - проверить, является ли argmax элементом np.max в np.where(myArray.sum(axis=1)), тогда он будет вверх.

myArray_sum = myArray.sum(axis=1)
if np.max(np.where(myArray_sum)) == np.argmax(myArray_sum):
    print ('up')
else:
    print ('down')

Если вы хотите первыйи последний ряд, здесь один способ, но он связан со значением черного пикселя.

myArray_sum = myArray.sum(axis=1)
firstRow = np.argmax(myArray_sum == 255)
lastRow = np.argmax(myArray_sum)
...