在 numpy 数组中查找包含黑色像素的第一行和最后一行

Finding the first and last rows that contain a black pixel, in a numpy array

我有一个三角形的黑白图像(它只包含 0 和 255 像素值)。

我已将其转换为名为 myArray

的 numpy 数组

目前,我可以通过以下代码找到三角形底部的width(黑色像素的数量):

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

如果三角形被倒置,width 将应用于倒置三角形的顶部。

我想做的是确定三角形是向上还是向下。

我可以找到包含黑色像素的第一行,然后计算该行中黑色像素的数量,调用此 firstRow

并找到包含黑色像素的最后一行,并计算该行中黑色像素的数量,调用 lastRow

那么,如果firstRow < lastRow,三角形是向上的。

计算 firstRowlastRow 的最佳方法是什么?

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.]])

axis=1 上使用 sum 后,您可以使用 np.where 获得至少有一个黑色像素的所有行:

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

如果你想得到黑色像素最大的行,你可以在sum后使用np.argmax on axis=1:

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

要知道三角形是向上还是向下,一种方法是检查 argmax 是否是 np.where(myArray.sum(axis=1)) 中的 np.max 元素,然后它会向上。

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)