2016-12-06 38 views
0

我想调整图像的大小适合于较小的尺寸。例如,我想将我的100x100像素图像调整为58x58像素图像。阵列的值是强度或通量值。我想要在转换后保存图像的总强度。这不适用于skimage调整大小。根据我放大或缩小的因素,我的总价值会降低。我已经在下面显示了迄今为止我尝试过的代码。skimage调整大小变化总数

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 

我试图与不同的尺寸和它的作品,除了非常小的值。任何人都可以解释为什么这种关系是真实的,或者这只是一个统计巧合。

+0

为什么不干脆重新归一化的强度缩放后? – maxymoo

+0

我是否应该将我的强度标准化为我的缩放因子的平方?如果是这种情况,你能告诉我为什么这种关系是真实的吗? – Vishnu

+0

你可能想看看:http://scikit-image.org/docs/dev/api/skimage.transform.html#skimage.transform.downscale_local_mean –

回答

3

如果治疗的图像其中I = Width x HeightN = Width x Height具有在[0,1]范围强度的一组像素,它是完全正常的图像尺寸调整到M = newWidth x newWeight后强度之和完全从之前不同。

假设图像IN像素的强度均匀分布在[0,1]范围内。那么强度的总和将近似为0.5 * N。如果您使用的是skimage的resize,则图像将通过interpolating调整为较小(或较大)的尺寸。插值不会累积值(如您所期望的那样),它会替代邻域中的平均值来预测新图像中每个像素的值。因此,图像的强度范围不会改变,值为,修改为,因此,新调整大小的图像的强度总和将近似为0.5 * M。如果M != N那么强度的总和会有很大的不同。

,你能做些什么来解决这个问题:

  1. 重新大规模新的数据与其大小成正比:

    >>> 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对于图像中的每个像素是相等的,并不是所有的像素都将用相同的权重进行插值,因此,增加了小的人工制品。

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

    >>> 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 
    
+0

谢谢你的链接和你的答案。我现在明白了,它很好地解释了。 – Vishnu