gpt4 book ai didi

python - 在 Python NumPy 中拉伸(stretch)图像的最有效方法

转载 作者:行者123 更新时间:2023-12-01 02:05:49 25 4
gpt4 key购买 nike

我想要一个函数将图像作为 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

您的代码中有错误。

image[i] = 1. 或 0. 的计算结果始终为 1.0,因为 1. 的作用是 truthy .

相反,该 block 应该如下所示:

if image[i] < minimum:
image[i] = 0.
elif image[i] > maximum:
image[i] = 1
else:
image[i] = (image[i] - minimum) / r

错误#2

如果您的原始数组是 dtype=int 并且您将值放入其中,它们将被强制为 int。这意味着任何float都将向下舍入。

a = np.array([1])
a[0] = 0.5
a

返回

array([0])

可以使用下面的矢量化解决方案来解决这个问题。

解决方案

一般来说,在处理 NumPy 数组时尽量不要使用循环。使用矢量化函数可以更快、更易读。

def stretch(image, minimum, maximum):
image = (image - minimum) / (maximum - minimum)
image[image < 0] = 0
image[image > 1] = 1
return image

一个示例(已更新为 int,正如 @MrT 指出的那样,这对于 image 来说更加真实):

a = np.arange(1, 4).reshape(2, 2)
stretch(a, 1, 3)

返回

array([[0. , 0.5],
[1. , 1. ]])

关于python - 在 Python NumPy 中拉伸(stretch)图像的最有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49085456/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com