簡體   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