Python skimage resize更改数组的总和

Python skimage resize更改数组的总和,python,python-3.x,numpy,image-resizing,scikit-image,Python,Python 3.x,Numpy,Image Resizing,Scikit Image,我想将fits格式的图像调整为更小的尺寸。例如,我想将我的100x100像素图像调整为58x58像素图像。阵列的值是强度值或通量值。我希望图像的总强度在变换后保持不变。这不适用于略读调整大小。我的总价值减少取决于我放大或缩小的因素。我已经在下面展示了我迄今为止尝试的代码 import numpy as np from skimage.transform import resize image=fits.open(directory+file1) cutout=image[0].data ou

我想将fits格式的图像调整为更小的尺寸。例如,我想将我的100x100像素图像调整为58x58像素图像。阵列的值是强度值或通量值。我希望图像的总强度在变换后保持不变。这不适用于略读调整大小。我的总价值减少取决于我放大或缩小的因素。我已经在下面展示了我迄今为止尝试的代码

import numpy as np
from skimage.transform import resize


image=fits.open(directory+file1)
cutout=image[0].data
out = resize(cutout, (58,58), order=1, preserve_range=True)
print(np.sum(out),np.sum(cutout))
我的输出是:

0.074657436655 0.22187 (I want these two values to be equal)
如果我使用以下方法将其缩放到相同的尺寸:

out = resize(cutout, (100,100), order=1, preserve_range=True)
print(np.sum(out),np.sum(cutout))
我的输出非常接近我想要的:

0.221869631852 0.22187
我有同样的问题,如果我试图增加图像大小以及

out = resize(cutout, (200,200), order=1, preserve_range=True)
print(np.sum(out),np.sum(cutout))
输出:

0.887316320731 0.22187
我想知道这个问题是否有解决办法

编辑1:

我刚刚意识到,如果我把我的图像乘以我想增加或减少图像大小的比例的平方,那么我的总和是守恒的

例如:

x=58
out = resize(cutout, (x,x), order=1, preserve_range=True)
test=out*(100/x)**2
print(np.sum(test),np.sum(cutout))
我的输出非常接近我想要的,但略高:

0.221930548915 0.22187

我用不同的维度尝试了这个方法,除了非常小的值外,它都有效。有人能解释为什么这个关系是真的,或者这只是统计上的巧合。

如果你把一幅图像
I=Width x Height
其中
N=Width x Height
看作一组强度在
[0,1]
范围内的像素,将图像大小调整为
M=newWidth x newWeight
后,强度总和与之前完全不同,这是完全正常的

假设具有
N
像素的图像
I
的强度在
[0,1]
范围内均匀分布。然后强度之和约为
0.5*N
。如果使用skimage的调整大小,则图像的大小将调整为更小(或更大)的大小。插值不会累积值(正如您所期望的那样),而是将邻域中的值平均,以预测新图像中每个像素的值。因此,图像的强度范围不改变,值被修改,因此,新调整大小的图像的强度总和将大约为
0.5*M
。如果
M!=N
则强度之和会有很大差异

解决此问题的方法是:

  • 根据新数据的大小按比例重新缩放数据:

    >>> y, x = (57, 58)
    >>> out = resize(data, (y,x), order=1, preserve_range=True)
    >>> out = out * (data.shape[0] / float(y)) * (data.shape[1] / float(x))
    
    这与您的建议类似,但适用于任何大小的图像(不仅仅是方形图像)。然而,这用恒定因子
    out[i,j]*=X
    补偿每个像素,其中
    X
    对于图像中的每个像素是相等的,并且并非所有像素都将以相同的权重进行插值,因此,增加了小的人工伪影

  • 我认为最好用图像中的平均强度(不依赖于像素数量)替换图像的总和(取决于图像上的像素数量)


  • 为什么不在缩放后重新标准化强度?我应该将强度标准化为缩放因子的平方吗?如果是这种情况,你能告诉我为什么这种关系是真实的吗?你可能想看看:谢谢你的链接和你的答案。我现在明白了,解释得很好。
    >>> meanI = np.sum(I) / float(I.size)   # Exactly the same as np.mean(I) or I.mean()
    >>> meanInew = np.sum(out) / float(out.size)
    >>> np.isclose(meanI, meanInew) # True