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)
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")
8条答案
按热度按时间eqfvzcg81#
scikit-image
在这里实现了downsampling
的一个工作版本,尽管他们不愿意称之为downsampling
,因为它不是DSP方面的下采样,如果我理解正确的话:http://scikit-image.org/docs/dev/api/skimage.measure.html#skimage.measure.block_reduce
但它运行得非常好,而且它是我在Python中找到的唯一一个可以处理图像中的
np.nan
的downsampler
,我用它对巨大的图像进行了快速的下采样。flvtvl502#
缩减采样时,插值是错误的做法。请始终使用聚合方法。
我使用块的方式来做到这一点,使用一个“因子”来降低分辨率。
例如,使用因子5(5x5块)的(100,200)形状阵列产生(20,40)阵列结果:
b0zn9rqh3#
imresize和ndimage.interpolation.zoom看起来像它们做了你想要的事情
我还没有尝试过imresize之前,但这里是我如何使用ndimage。插值。缩放
那么A是其中具有内插值的4 × 4矩阵
guicsvcw4#
array[0::2]
表示法,它只考虑每隔一个索引。具有输出:
5ssjco0h5#
因为OP只是想要一个更粗的分辨率,我想我会分享我的方法来减少一半的像素数量在每个维度。我采取的平均值2x2块。这可以应用多次,以减少因子2。
u4vypkhs6#
xarray的“coarsen”方法可以对xarray.Dataset或xarray.DataArray进行缩减采样
例如:
j9per5c47#
这可能不是你要找的,但我想我会提到它的完整性。
您可以尝试安装
scikits.samplerate
(docs),它是libsamplerate的Python Package 器。它提供了很好的高质量重采样算法--但据我所知,它只适用于1D。您可以先沿着一个轴重采样2D信号,然后再沿另一个轴重采样,但我认为这可能会抵消高质量重采样的好处。e4eetjau8#
这将获取任何分辨率的图像,并通过获取图像数组的第4个索引,仅返回其大小的四分之一。