2017-08-15 113 views
2

我想應用到一個簡單的磁盤過濾器適合文件: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之間「。 發生了什麼事?

回答

0

這應該可以幫助你解決你的問題。我最初爲這個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

相關問題