gpt4 book ai didi

python - 从np.float64到np.uint8的快速转换(带有缩放和裁剪)

转载 作者:行者123 更新时间:2023-12-02 16:52:04 25 4
gpt4 key购买 nike

我试图找到最快的方法来缩放和转换python中的数据类型。这是一种实现方法,但是速度很慢:

# image is a large np.float64 image with values in an arbitrary range
timeit.timeit(lambda: np.clip(image*255, 0, 255).astype(np.uint8), number=100)
=> 4.746736011002213 seconds

我注意到opencv具有函数 convertScaleAbs,该函数执行几乎正确的操作,但是在顶部添加了不必要的 abs。这快得多,但是使所有负值都为正而不是零:
timeit.timeit(lambda: cv2.convertScaleAbs(image, alpha=255, beta=0), number=100)
=> 0.7875663779996103 seconds
cv::MatconvertTo函数也可以使用,但是在 python Realm 似乎并不存在。

还有其他关于如何加快速度的想法吗?

最佳答案

在乘法和clip()期间都将复制您的数组,如果可以在适当的位置执行它,则它将加快速度。

import numpy as np
import timeit

side = 10000

source = np.random.random(side * side).reshape((side, side)) * 2 ** 16


def clip_1(image):
return np.clip(image * 255, 0, 255).astype(np.uint8)


def clip_2(image):
image *= 255
return np.clip(image, 0, 255, out=image).astype(np.uint8)


print('clip 1:', timeit.timeit(lambda: clip_1(source), number=10)) # 23.395304517
print('clip 2:', timeit.timeit(lambda: clip_2(source), number=10)) # 13.009874021000002

或者尝试使用cv2并在事实发生后恢复符号:
clipped = cv2.convertScaleAbs(image, alpha=0, beta=255)
clipped *= np.sign(image)

关于python - 从np.float64到np.uint8的快速转换(带有缩放和裁剪),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59395275/

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