Python scipy.ndimage.zoom结果取决于图像大小

Python scipy.ndimage.zoom结果取决于图像大小,python,scipy,interpolation,ndimage,Python,Scipy,Interpolation,Ndimage,我注意到scipy.ndimage.zoom的结果取决于原始图像的大小。在下面的代码示例中,将生成棋盘格图像,然后使用ndimage.zoom进行缩放。如果一个棋盘格平铺仅为2x2像素,则缩放因子似乎太大,结果图像会被裁剪。相比之下,如果瓷砖的尺寸为10x10,则效果良好 from __future__ import division import numpy as np from scipy import ndimage, misc import wx y,x = 2,2 # chan

我注意到scipy.ndimage.zoom的结果取决于原始图像的大小。在下面的代码示例中,将生成棋盘格图像,然后使用ndimage.zoom进行缩放。如果一个棋盘格平铺仅为2x2像素,则缩放因子似乎太大,结果图像会被裁剪。相比之下,如果瓷砖的尺寸为10x10,则效果良好

from __future__ import division

import numpy as np
from scipy import ndimage, misc
import wx

y,x = 2,2   # change tile size here
imgdata = np.zeros((y,x),dtype='uint8')
imgdata[y/2:,x/2:] = 255
imgdata[:y/2,:x/2] = 255
imgdata = np.tile(imgdata,(4,4))
imgdata = np.array((imgdata,imgdata,imgdata))
d,y,x = imgdata.shape

zoom = 200.0/y

w, h = int(x*zoom), int(y*zoom)

app = wx.App(None)

zoomed = np.ascontiguousarray(ndimage.interpolation.zoom(imgdata,[1,zoom, zoom],order=0).transpose((1,2,0)), dtype='uint8')
image = wx.ImageFromBuffer(w, h, zoomed)
image.SaveFile('zoomed.png',wx.BITMAP_TYPE_PNG)
02x02瓷砖:

10x10瓷砖:

据我所知,我一直在使用scipy.misc.imresize,它没有显示这种行为,但我希望避免对PIL的额外依赖


我是做错了什么,还是这是zoom中的一个bug?

我已经有一段时间没有你发布你的问题了。。。如果您仍然感兴趣,我遇到了类似的问题,并使用了以下方法:

import skimage
data_new = skimage.transform.resize(data_old, [new_shape_x, new_shape_z], order = 0)
确保将“顺序”设置为0,因为默认值为“顺序”=1,这将导致值之间的一阶样条插值(这将导致瓷砖在其边界处模糊)

不管怎么说,我不知道这是否是一个好方法,但它对我来说很有效。我无法回答这是否是一个bug,因为我对编程的了解还不够,无法回答这个问题。此外,我还尝试使用scipy.ndimage.interpolation.zoom函数,但是瓷砖的边界并不是它们应该位于的位置,就像您的例子一样。因此我使用撇渣法

如果您对上下文感兴趣:我从事断裂力学,需要创建平稳变化的随机强度分布。所以我创建了一个结合了窦函数和余弦函数的曲面,在x和z方向上有一定数量的周期。然后取曲面的绝对值,乘以一个不规则的棋盘形曲面。棋盘状表面上每个方向上的瓷砖数量必须与相应强度变化表面上的周期数/2相匹配。最终曲面计算如下(分段加法和乘法):

其中必须调整随机网格的大小以匹配其他曲面的形状

strength_surface[i,j] = strength_mean[i,j] + random_grid[i,j] * strength_variation[i,j]