我想要一个函数将图像作为numpy数组接收,并根据输入范围中指定的最大值和最小值将值重新映射到新范围(0,1) . 我有一个工作函数,但我正在迭代数组,大约需要10秒才能完成 . 有没有更有效的方法来执行此任务?也许有些内置的numpy功能我不知道?
这就是我所拥有的:
import numpy as np
def stretch(image, minimum, maximum):
dY = image.shape[0]
dX = image.shape[1]
r = maximum - minimum
image = image.flatten()
for i in range(image.size):
if image[i] > maximum or image[i] < minimum:
image[i] = 1. or 0.
else:
image[i] = (image[i] - minimum) / r
return image.reshape(dY, dX)
我也尝试过使用numpy.nditer而不是手动迭代for循环的上述版本,但这似乎是慢四倍(~40秒) .
有一种更有效的方法可以做到这一点,我忽视了吗?我正在使用的图像大约是16 MP . (3520,4656)
1 回答
Bug#1
您的代码中存在错误 .
image[i] = 1. or 0.
始终求值为1.0
,因为1.
为truthy .相反,该块应如下所示:
Bug#2
如果您的原始数组是
dtype=int
并且您将值放入其中,则它们将被强制转换为int
. 这意味着任何float
将被向下舍入 .回报
这可以使用下面的矢量化解决方案来解决 .
解决方案
通常在处理NumPy数组时尽量不要使用循环 . 使用矢量化函数可以更快,更可读 .
一个例子(更新为
int
,对于image
更为现实,因为@MrT指出):回报