首先,它不应该需要6秒钟。在160x120图片上试用你的代码需要0.2秒。
这就是说,对于良好的numpy
性能,你通常希望避免循环。有时候,除了最小轴和沿着它的所有循环外,沿着所有的方向矢量化更简单,但是如果可能的话,你应该尽量一次完成所有的工作。这通常会使事情变得更快(将循环向下推到C)并且更容易。
您的循环本身似乎有点陌生,我 - 你似乎有一个差一错误都在你开始存储结果,其中的条款(第一个值放入z=1
,不z=0
)以及在多大程度上你正在寻找(range(0, x-1)
不包括x-1
方面,所以你错过了最后一排/ column--可能是你想要range(x)
。)
如果你想要的是指数,其中r > 120
但既不g > 100
也不b > 100
,有更简单的方法。我们可以创建布尔数组。例如,第一,我们可以做一些假的数据:
>>> r = np.random.randint(0, 255, size=(8,8))
>>> g = np.random.randint(0, 255, size=(8,8))
>>> b = np.random.randint(0, 255, size=(8,8))
然后,我们可以在其中找到我们的条件得到满足的地方:
>>> (r > 120) & ~(g > 100) & ~(b > 100)
array([[False, True, False, False, False, False, False, False],
[False, False, True, False, False, False, False, False],
[False, True, False, False, False, False, False, False],
[False, False, False, True, False, True, False, False],
[False, False, False, False, False, False, False, False],
[False, True, False, False, False, False, False, False],
[False, False, False, False, False, False, False, False],
[False, False, False, False, False, False, False, False]], dtype=bool)
然后我们可以使用np.where
得到的坐标:
>>> r_idx, c_idx = np.where((r > 120) & ~(g > 100) & ~(b > 100))
>>> r_idx
array([0, 1, 2, 3, 3, 5])
>>> c_idx
array([1, 2, 1, 3, 5, 1])
而且我们可以通过索引回r
,g
和b
:
>>> r[r_idx, c_idx]
array([166, 175, 155, 150, 241, 222])
>>> g[r_idx, c_idx]
array([ 6, 29, 19, 62, 85, 31])
>>> b[r_idx, c_idx]
array([67, 97, 30, 4, 50, 71])
为了您的回应,我忘记提及我正在使用Raspberry Pi来实现此目的。用你的方法实现布尔数组非常容易,但它仍然不能解决这个问题,我必须确定这个图像中的白色像素并存储它们的位置。我仍然需要一种扫描图像的方式,我可以识别白色像素并存储它们,而不需要花费6秒左右来实现 – RR1 2013-05-04 18:38:02
我不明白。上面的代码使用你的规则来构成一个白色像素 - '(r> 120)&〜(g> 100)&〜(b> 100))' - 并且给出白色像素所在的索引, r_idx'和'c_idx'是你的'row_array'和'col_array',没有浪费的零空间。无论如何,希望别人能够帮助你! – DSM 2013-05-04 18:43:55
哦,哇,对不起,我的头被整天看着电脑屏幕烧坏了!这很好,非常感谢你!现在我可以摆脱这些邪恶的循环!它只需要0.0117s!非常感谢!! – RR1 2013-05-04 19:01:37