gpt4 book ai didi

python - Numpy 数组的快速插值/重采样 - Python

转载 作者:行者123 更新时间:2023-12-03 15:14:43 51 4
gpt4 key购买 nike

目前,我已经编写了一些插入管道的 Python 代码。

传入的数据以 numpy 形状数组形式出现 (1,512,19,25)。我使用 scipy.ndimage.interpolation.zoom使阵列成形(1,512,38,50)。这可以通过对函数的一次调用来完成。基本上,它将每个 (19,25) 块的大小调整为 (38,50)。

在代码的后面,当数据以另一种方式移动时,不同的数据再次从另一个方向 (38,50) 调整为 (19,25)。

一切都按实现方式工作,但是我发现这真的很慢。例如,我测试了 scipy.ndimage.interpolation.zoom调整图像文件大小的函数,它比 Matlab 的 imresize 慢得多功能。

在 Python 中执行此操作的更快方法是什么?

最佳答案

TLDR; 查看 Skimage 的 pyramid_gaussian .在 (512, 512) 的单个图像上,它显示了 0.3M 倍的加速。 (163 毫秒/471 纳秒 = 346072)。 Pillow-SIMD是否super-fast重新采样/调整大小,但需要您在安装之前卸载 PIL、Pillow。它使用并行处理(单指令、多数据 - SIMD)和更好的算法,例如用顺序框模糊替换基于卷积的高斯模糊。建议在设置单独的 venv 后将其用于生产环境.

有多种方法可以对图像进行上采样和下采样。我将添加一些我使用过的方法的基准。当我遇到更多方法时,我会不断更新这个答案,以便这可以作为其他人的引用。

#Utility function for plotting original, upsampled, and downsampled image

def plotit(img, up, down):
fig, axes = plt.subplots(1,3, figsize=(10,15))
axes[0].imshow(img)
axes[1].imshow(up)
axes[2].imshow(down)
axes[0].title.set_text('Original')
axes[1].title.set_text('Upsample')
axes[2].title.set_text('Downsample')
IIUC,这有点像你的管道 -
from scipy.ndimage import zoom
from skimage.data import camera

img = camera() #(512,512)
up = zoom(img,2) #upsample image

#some code
...

down = zoom(up,0.5) #downsample the upsampled image

plotit(img, up, down)
enter image description here

方法与基准 (in no specific order)1.西比 zoom (订单=3)
使用给定顺序的样条插值对数组进行缩放,在这种情况下,默认值为 order = 3。
%%timeit
#from scipy.ndimage import zoom
up = zoom(img,2)
down = zoom(up,0.5)

#163 ms ± 12.1 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
2.西比 zoom (订单=0)
使用给定顺序的样条插值对数组进行缩放,在本例中,order = 0。
%%timeit
#from scipy.ndimage import zoom
up = zoom(img,2, order=0)
down = zoom(up,0.5, order=0)

#18.7 ms ± 950 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
3. Skimage pyramid_gaussian
在高斯金字塔中,后续图像使用高斯平均值(高斯模糊)进行加权并按比例缩小。对图像应用高斯模糊与使用高斯函数对图像进行卷积相同。模糊量取决于标准偏差大小 (sigma)。
%%timeit
#from skimage.transform import import pyramid_gaussian
up = pyramid_gaussian(img,2)
down = pyramid_gaussian(up,0.5)

#471 ns ± 30.4 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
4. Skimage pyramid_expandpyramid_reduce
图像金字塔是一种多尺度图像表示,其中对图像进行重复平滑和二次采样。第一个函数对图像进行平滑然后上采样,而第二个函数执行相同但下采样,默认情况下这两个函数都使用样条顺序=1。
%%timeit
#from skimage.transform import import pyramid_expand, pyramid_reduce
up = pyramid_expand(img,2)
down = pyramid_reduce(up,2)

#120 ms ± 3.08 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
5. Skimage rescale
按特定因子缩放图像。对放大或缩小 N 维图像执行样条插值(默认为 1 阶)。请注意,在缩小图像尺寸时应启用抗锯齿以避免锯齿伪影。
%%timeit
#from skimage.transform import import rescale
up = rescale(img,2)
down = rescale(up,0.5)

#83 ms ± 3.69 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
6. PIL resize具有最近像素 filter用于重采样
返回此图像的调整大小副本。从输入图像中选择一个最近的像素。忽略所有其他输入像素。
%%timeit
#from PIL import Image
im = Image.fromarray(img)
up = im.resize((im.width*2, im.height*2),resample=Image.NEAREST)
down = up.resize((up.width//2, up.height//2),resample=Image.NEAREST)

#704 µs ± 29.7 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
7. PIL resize带双线性 filter用于重采样
返回此图像的调整大小副本。对于调整大小,对可能对输出值有贡献的所有像素使用线性插值计算输出像素值。对于其他转换,使用输入图像中 2x2 环境的线性插值。
%%timeit
#from PIL import Image
im = Image.fromarray(img)
up = im.resize((im.width*2, im.height*2),resample=Image.BILINEAR)
down = up.resize((up.width//2, up.height//2),resample=Image.BILINEAR)

#10.2 ms ± 877 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
8. PIL resize与 BICUBIC filter用于重采样
返回此图像的调整大小副本。对于调整大小,对可能对输出值有贡献的所有像素使用三次插值计算输出像素值。对于其他转换,使用输入图像中 4x4 环境的三次插值。
%%timeit
#from PIL import Image
im = Image.fromarray(img)
up = im.resize((im.width*2, im.height*2),resample=Image.BICUBIC)
down = up.resize((up.width//2, up.height//2),resample=Image.BICUBIC)

#12.3 ms ± 326 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
9. PIL resize与 Lanczos filter用于重采样
返回此图像的调整大小副本。使用高质量 Lanczos 滤波器(截断的 sinc)对可能对输出值有贡献的所有像素计算输出像素值。
%%timeit
#from PIL import Image
im = Image.fromarray(img)
up = im.resize((im.width*2, im.height*2),resample=Image.LANCZOS)
down = up.resize((up.width//2, up.height//2),resample=Image.LANCZOS)

#15.7 ms ± 184 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

关于python - Numpy 数组的快速插值/重采样 - Python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35381551/

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