【发布时间】:2018-09-03 12:08:34
【问题描述】:
我有一个包含从.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
【问题讨论】:
-
If I were to choose between shortest code vs fastest execution I'd be more interested in fastest code.fastest code你的意思是最快的执行,对吧? -
是的,我刚刚更正了措辞。
-
你可以在不迭代的情况下做到这一点,首先屏蔽
>0,然后询问每个轴上的最小和最大掩码索引,然后对其进行切片。我不认为那时它会明显更快或更易读,但是……可能值得一试。 -
@abarnet:你为什么不写下答案让我接受呢?似乎 droooze 确实写了一个正确的答案,但后来他删除了它:-/
-
@Chupo_cro 抱歉,我想更改一些内容以使其更通用。
标签: python arrays numpy image-processing