我有一个二维数组,其中包含从.png
创建的灰度图像,如下所示:
import cv2
img = cv2.imread("./images/test.png")
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
我可以帮您翻译成中文。这段内容与编程有关,需要提取一个子数组,仅包含包含数据的矩形 - 忽略图像周围的所有零值。例如,如果输入为:
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 175 0 0 0 71 0
0 0 0 12 8 54 0 0
0 0 0 0 255 0 0 0
0 0 0 2 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
那么输出应该是:
175 0 0 0 71
0 12 8 54 0
0 0 255 0 0
0 2 0 0 0
我可以按照正向顺序迭代行来查找第一个非零行,然后反向迭代行以查找最后一个非零行并记住索引 - 然后对列进行相同的操作,然后使用该数据提取子数组,但我肯定有更合适的方法来完成同样的任务,甚至可能有专门设计用于此目的的NumPy函数。
如果我必须在最短的代码和最快的执行之间选择,我会更加关心最快的执行。
编辑:
我没有包含最好的示例,因为中间可能有零行/零列,如下所示:
输入:
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 175 0 0 0 71 0
0 0 0 12 8 54 0 0
0 0 0 0 255 0 0 0
0 0 0 0 0 0 0 0
0 0 0 2 0 0 0 0
0 0 0 0 0 0 0 0
输出:
175 0 0 0 71
0 12 8 54 0
0 0 255 0 0
0 0 0 0 0
0 2 0 0 0
>0
进行遮蔽,然后在每个轴上查找最小和最大的掩码索引,最后在该范围内进行切片。我认为在这一点上它可能不会显著提高速度或可读性,但是...值得一试。 - abarnert