在保存求和的同时重新组合ndarray

时间:2017-08-21 05:32:19

标签: python numpy image-processing

我正在寻找一些可以用来重新绑定某些ndarray的函数,它满足:

  1. 结果可以是任意尺寸,可以升级或缩小尺寸。
  2. 重组后,总和应与以前相同。
  3. 不应改变整体图像形状。换句话说,在升级的情况下它应该是可逆的。
  4. 第二个约束不仅仅是求和 - 归一化等,而且重组算法本身应该计算原始数组元素在结果数组元素中重叠的分数。

    可以用这种方式测试第三个参数:

    # image is ndarray with shape of 20x20
    func(image, func(image, [40,40]),[20,20])==image # if func works as intended
    

    到目前为止,我只知道两个函数,即

    • ndarray.resize:我不完全明白它的作用,但基本上不是我想要的。
    • scipy.misc.imresize:它会插入每个元素的值,这对我的目的来说并不是那么好。

    但他们不满足我提到的条件。举个例子,我附上了一个代码来论证scipy.misc.imresize的行为。

    import numpy as np
    from scipy.special import erf
    import matplotlib.pyplot as plt
    from scipy.misc import imresize
    
    def gaussian(size, center, width, a):
        xcoord=np.arange(size[0])[:,np.newaxis]+np.zeros(size[1])[np.newaxis,:]
        ycoord=np.zeros(size[0])[:,np.newaxis]+np.arange(size[1])[np.newaxis,:]
        return a*((erf((xcoord+1-center[0])/(width[0]*np.sqrt(2)))-erf((xcoord-center[0])/(width[0]*np.sqrt(2))))*
                  (erf((ycoord+1-center[1])/(width[1]*np.sqrt(2)))-erf((ycoord-center[1])/(width[1]*np.sqrt(2)))))
    
    size=np.asarray([20,20])
    c=[[0.1,0.2],[0.4,0.6],[0.8,0.4]]
    c=[np.asarray(x) for x in c]
    s=[[0.02,0.02],[0.05,0.05],[0.03,0.01]]
    s=[np.asarray(x) for x in s]
    im = gaussian(size, c[0]*size, s[0]*size, 1) \
        +gaussian(size, c[1]*size, s[1]*size, 3) \
        +gaussian(size, c[2]*size, s[2]*size, 2)
    sciim=imresize(imresize(im,[40,40]),[20,20])
    plt.imshow(im/np.sum(im)-sciim/np.sum(sciim))
    plt.show()
    

    那么,是否有任何功能,最好是某些包的内置功能,满足我的要求?

    对于其他语言,我知道IDL中的frebin与我提到的一样。当然我可以重新编写这个函数,或者也许有人已经完成了它,但我想知道是否有任何现有的解决方案。

1 个答案:

答案 0 :(得分:0)

当扩展为整数值时,

frebin实现像素复制(就像玩具问题的2倍增加一样)。如果您希望在这种情况下具有类似的可逆性,请尝试以下方法:

def py_frebin(im, shape):
    if np.isclose(x.shape % shape , np.zeros.like(x.shape)):
        interp = 'nearest'
    else:
        interp = 'lanczos'
    im2 = scipy.misc.imresize(im, shape, interp = interp, mode = 'F')
    im2 *= im.sum() / im2.sum()
    return im2

在非整数扩展中应优于frebin(因为frebin似乎正在执行interp = 'bilinear',这是不可逆的),并且在积分扩展中类似。