Vis*_*hnu 3 python numpy image-resizing python-3.x scikit-image
我想以适合的格式将图像调整为较小的尺寸。例如,我想将100x100像素的图像调整为58x58像素的图像。数组的值是强度或通量值。我希望在变换后保留图像的总强度。这不适用于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))
Run Code Online (Sandbox Code Playgroud)
我的输出是:
0.074657436655 0.22187 (I want these two values to be equal)
Run Code Online (Sandbox Code Playgroud)
如果我使用以下方法将其缩放到相同的尺寸:
out = resize(cutout, (100,100), order=1, preserve_range=True)
print(np.sum(out),np.sum(cutout))
Run Code Online (Sandbox Code Playgroud)
我的输出非常接近我想要的:
0.221869631852 0.22187
Run Code Online (Sandbox Code Playgroud)
如果我也尝试增加图像尺寸,也会遇到同样的问题。
out = resize(cutout, (200,200), order=1, preserve_range=True)
print(np.sum(out),np.sum(cutout))
Run Code Online (Sandbox Code Playgroud)
输出:
0.887316320731 0.22187
Run Code Online (Sandbox Code Playgroud)
我想知道是否有解决此问题的方法。
编辑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))
Run Code Online (Sandbox Code Playgroud)
我的输出非常接近我想要的输出,但略高一些:
0.221930548915 0.22187
Run Code Online (Sandbox Code Playgroud)
我尝试了不同的尺寸,除了很小的值外,它都可以工作。任何人都可以解释为什么这种关系是正确的还是仅仅是统计上的巧合。
如果治疗的图像I = Width x Height其中N = Width x Height与在范围内的强度的一组像素[0,1],它是完全正常的图像尺寸变换后M = newWidth x newWeight强度的总和完全从之前不同。
假定I具有N像素的图像的强度在范围内均匀分布[0,1]。然后强度的总和将约为0.5 * N。如果您使用skimage resize,则会通过插值将图像调整为较小(或较大)的尺寸。插值不会累积值(如您预期的那样),而是会在邻域中取平均值以预测新图像中每个像素的值。因此,图像的强度范围不会改变,值会被修改,因此新调整大小后的图像的强度总和将近似为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))
Run Code Online (Sandbox Code Playgroud)
这类似于您的建议,但适用于任何大小的图像(不仅是正方形图像)。然而,这对于具有恒定因子的每个像素补偿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
Run Code Online (Sandbox Code Playgroud)| 归档时间: |
|
| 查看次数: |
867 次 |
| 最近记录: |