[英]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)
您的代碼中有一個錯誤。
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
如果您的原始數組是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.