我正在寻找一些可以用来重新绑定某些ndarray
的函数,它满足:
第二个约束不仅仅是求和 - 归一化等,而且重组算法本身应该计算原始数组元素在结果数组元素中重叠的分数。
可以用这种方式测试第三个参数:
# 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
与我提到的一样。当然我可以重新编写这个函数,或者也许有人已经完成了它,但我想知道是否有任何现有的解决方案。
答案 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'
,这是不可逆的),并且在积分扩展中类似。