`LinAlgError:当尝试使用`skimage.transform.rescale重新缩放4D阵列时,SVD没有收敛'

时间:2015-11-21 03:15:21

标签: python image numpy scikit-image rescale

我想将MNIST数据的4D数组重新调整0.5倍。我使用skimage.transform.rescale收到错误:

LinAlgError: SVD did not converge

我觉得它可能与图像尺寸有关,但文档没有提到图像尺寸。

from skimage import transform
...
...
data = load_mnist() #Contains mnist data in format (50000, 1, 28, 28)
data_rescaled = transform.rescale(data, 0.5)

1 个答案:

答案 0 :(得分:1)

来自the documentation

  

<强> skimage.transform.rescale(image, scale, order=1, mode='constant', cval=0, clip=True, preserve_range=False) [source]

     

按特定因子缩放图像。

     

对高档或低档图像执行插值。要通过应用算术和或均值对具有整数因子的N维图像进行下采样,请分别参见skimage.measure.local_sumskimage.transform.downscale_local_mean。   ...

     

比例:{float,浮动元组}

     

比例因子。单独的比例因子可以定义为(row_scale, col_scale)

我的解释是skimage.measure.rescale仅支持2D图像。快速尝试为每个维度传递单独的缩放因子似乎证实了这一点:

In [1]: data = np.random.randn(500, 1, 28, 28)

In [2]: rescaled = transform.rescale(data, (0.5, 0.5, 0.5, 0.5))
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-2-638fc58c2154> in <module>()
----> 1 rescaled = transform.rescale(data, (0.5, 0.5, 0.5, 0.5))

/home/alistair/.venvs/rfmap/lib/python2.7/site-packages/skimage/transform/_warps.pyc in rescale(image, scale, order, mode, cval, clip, preserve_range)
    164 
    165     try:
--> 166         row_scale, col_scale = scale
    167     except TypeError:
    168         row_scale = col_scale = scale

ValueError: too many values to unpack

正如文档所述,您可以使用skimage.transform.local_sumskimage.downscale_local_mean,前提是您只需要按整数因子(在您的情况下为2)进行缩减采样。

另一种支持对非整数缩放因子使用插值的替代方法是scipy.ndimage.zoom

In [3]: from scipy import ndimage

In [4]: rescaled = ndimage.zoom(data, 0.5)

In [5]: rescaled.shape
Out[5]: (250, 1, 14, 14)