繁体   English   中英

在Python NumPy中拉伸图像的最有效方法

[英]Most efficient way to stretch an image in Python NumPy

我希望函数将图像作为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. or 0.因为1.行为不实,所以总是求值为1.0

相反,该块应如下所示:

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. ]])

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM