ValueError异常:float类型的图片必须是-1和1之间

问题描述:

我想应用到一个简单的磁盘过滤器适合文件:ValueError异常:float类型的图片必须是-1和1之间

from skimage.morphology import disk 
from skimage.filters.rank import median 
import numpy as np 
import matplotlib.pyplot as plt 
from astropy.io import fits 

# Open data files for image and mask 
hdulist = fits.open('xbulge-w1.fits') 
w1data = hdulist[0].data 

hdulistmask = fits.open('xbulge-mask.fits') 
maskdata = hdulistmask[0].data 
mask = 1 - maskdata 

w1_masked = np.ma.array(w1data, mask = mask) 
selem = disk(5) 
filt = median(w1_masked, 
          selem=disk(5), 
          out=None, 
          mask=mask) 

plt.imshow(filt) 
plt.show() 

但是这给了我一个“ValueError异常:float类型的图像必须介于-1和1之间“。 发生了什么事?

这应该可以帮助你解决你的问题。我最初为这个question写了这个答案,这个答案大概是相同的消息错误,对于过滤操作也是如此。

一般来说,(这是有效的其他编程语言),可以将图像信号通常表示在2种方式:

  • 与强度值的范围在[0, 255]。在这种情况下,这些值的类型为uint8 - 无符号整数8字节。
  • ,其强度值在[0, 1]的范围内。在这种情况下,值 的类型为float。

根据语言和库的不同,像素强度允许的值的类型和范围可以更宽容或更宽松。

这里的错误告诉你图像的像素值是float,但它们不在[-1, 1]的范围内。如果值在[0, 255](或[-255, 255])之间,则只需将它们全部除以255即可。将值转换为整数也可能有效。

这适用于表示为常规数组(或矩阵,取决于语言)的图像。在你的情况下,使用掩码数组涉及掩码值既不是浮动也不是整数。因此,如果你继续使用被屏蔽的数组,我怀疑你可以使用常规的过滤函数。

+0

我已经添加了线 w1_masked_rescaled = w1_masked/255 打印(np.any(w1_masked_rescaled> 1)) 的声明以下w1_masked但我仍然得到同样的错误。我应该在哪里除以255? – Jim421616

+0

我不认为你可以使用被屏蔽的数组...如果你想使用常规的过滤函数,你将需要用一个有效的值替换被屏蔽的值,跟踪被屏蔽的值的位置并将它们添加回去...'numpy.ma'的文档没有提及任何过滤操作... – Eskapp

+0

这是怎么回事? https://docs.scipy.org/doc/numpy/reference/generated/numpy.ma.median.html – Jim421616