【问题标题】:scipy.ndimage.zoom result depends on image sizescipy.ndimage.zoom 结果取决于图像大小
【发布时间】:2016-12-04 08:58:31
【问题描述】:

我注意到 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 的额外依赖。

是我做错了什么还是缩放中的错误?

【问题讨论】:

    标签: python scipy interpolation ndimage


    【解决方案1】:

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

    import skimage
    data_new = skimage.transform.resize(data_old, [new_shape_x, new_shape_z], order = 0)
    

    确保设置 order = 0,因为默认值为 order = 1,这将导致值之间的一阶样条插值(这会导致图块在其边界处模糊)。

    无论如何,我不知道这是否是一个好方法,但它对我有用。如果这是一个错误,我无法回答,因为我真的对编程知之甚少,无法回答这个问题。此外,我还尝试使用 scipy.ndimage.interpolation.zoom 函数,但是瓷砖的边界不在它们应该在的位置,就像你的情况一样。因此我使用了 skimage。

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

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

    必须调整 random_grid 的大小以匹配其他表面的形状。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-29
      • 2020-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-20
      • 2014-02-13
      相关资源
      最近更新 更多