scipy Python中的缩减采样数组

odopli94  于 2022-11-10  发布在  Python
关注(0)|答案(8)|浏览(270)

我有基本的2-D numpy数组,我想将它们“降采样”到更粗糙的分辨率。有没有简单的numpy或scipy模块可以轻松地完成这一任务?我还应该注意到,这个数组是通过底图模块在地理上显示的。
样品:x1c 0d1x

eqfvzcg8

eqfvzcg81#

scikit-image在这里实现了downsampling的一个工作版本,尽管他们不愿意称之为downsampling,因为它不是DSP方面的下采样,如果我理解正确的话:
http://scikit-image.org/docs/dev/api/skimage.measure.html#skimage.measure.block_reduce
但它运行得非常好,而且它是我在Python中找到的唯一一个可以处理图像中的np.nandownsampler,我用它对巨大的图像进行了快速的下采样。

flvtvl50

flvtvl502#

缩减采样时,插值是错误的做法。请始终使用聚合方法。
我使用块的方式来做到这一点,使用一个“因子”来降低分辨率。

import numpy as np
from scipy import ndimage

def block_mean(ar, fact):
    assert isinstance(fact, int), type(fact)
    sx, sy = ar.shape
    X, Y = np.ogrid[0:sx, 0:sy]
    regions = sy//fact * (X//fact) + Y//fact
    res = ndimage.mean(ar, labels=regions, index=np.arange(regions.max() + 1))
    res.shape = (sx//fact, sy//fact)
    return res

例如,使用因子5(5x5块)的(100,200)形状阵列产生(20,40)阵列结果:

ar = np.random.rand(20000).reshape((100, 200))
block_mean(ar, 5).shape  # (20, 40)
b0zn9rqh

b0zn9rqh3#

imresize和ndimage.interpolation.zoom看起来像它们做了你想要的事情
我还没有尝试过imresize之前,但这里是我如何使用ndimage。插值。缩放

a = np.array(64).reshape(8,8)
a = ndimage.interpolation.zoom(a,.5) #decimate resolution

那么A是其中具有内插值的4 × 4矩阵

guicsvcw

guicsvcw4#

  • 最简单的方法 *:你可以使用array[0::2]表示法,它只考虑每隔一个索引。
array= np.array([[i+j for i in range(0,10)] for j in range(0,10)])
down_sampled=array[0::2,0::2]

print("array \n", array)
print("array2 \n",down_sampled)

具有输出:

array 
[[ 0  1  2  3  4  5  6  7  8  9]
 [ 1  2  3  4  5  6  7  8  9 10]
 [ 2  3  4  5  6  7  8  9 10 11]
 [ 3  4  5  6  7  8  9 10 11 12]
 [ 4  5  6  7  8  9 10 11 12 13]
 [ 5  6  7  8  9 10 11 12 13 14]
 [ 6  7  8  9 10 11 12 13 14 15]
 [ 7  8  9 10 11 12 13 14 15 16]
 [ 8  9 10 11 12 13 14 15 16 17]
 [ 9 10 11 12 13 14 15 16 17 18]]
array2 
[[ 0  2  4  6  8]
 [ 2  4  6  8 10]
 [ 4  6  8 10 12]
 [ 6  8 10 12 14]
 [ 8 10 12 14 16]]
5ssjco0h

5ssjco0h5#

因为OP只是想要一个更粗的分辨率,我想我会分享我的方法来减少一半的像素数量在每个维度。我采取的平均值2x2块。这可以应用多次,以减少因子2。

from scipy.ndimage import convolve
array_downsampled = convolve(array, 
                 np.array([[0.25,0.25],[0.25,0.25]]))[:array.shape[0]:2,:array.shape[1]:2]
u4vypkhs

u4vypkhs6#

xarray的“coarsen”方法可以对xarray.Dataset或xarray.DataArray进行缩减采样

例如:

import xarray as xr
import numpy as np
import matplotlib.pyplot as plt

fig, (ax1, ax2, ax3) = plt.subplots(1, 3, figsize=(15,5))

# Create a 10x10 array of random numbers

a = xr.DataArray(np.random.rand(10,10)*100, dims=['x', 'y'])

# "Downscale" the array, mean of blocks of size (2x2)

b = a.coarsen(x=2, y=2).mean()

# "Downscale" the array, mean of blocks of size (5x5)

c = a.coarsen(x=5, y=5).mean()

# Plot and cosmetics

a.plot(ax=ax1)
ax1.set_title("Full Data")

b.plot(ax=ax2)
ax2.set_title("mean of (2x2) boxes")

c.plot(ax=ax3)
ax3.set_title("mean of (5x5) boxes")

j9per5c4

j9per5c47#

这可能不是你要找的,但我想我会提到它的完整性。
您可以尝试安装scikits.sampleratedocs),它是libsamplerate的Python Package 器。它提供了很好的高质量重采样算法--但据我所知,它只适用于1D。您可以先沿着一个轴重采样2D信号,然后再沿另一个轴重采样,但我认为这可能会抵消高质量重采样的好处。

e4eetjau

e4eetjau8#

这将获取任何分辨率的图像,并通过获取图像数组的第4个索引,仅返回其大小的四分之一。

import cv2
import numpy as np

def quarter_res_drop(im):

    resized_image = im[0::4, 0::4]
    cv2.imwrite('resize_result_image.png', resized_image)

    return resized_image

im = cv2.imread('Your_test_image.png', 1)

quarter_res_drop(im)

相关问题