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». Что происходит?


person Jim421616    schedule 15.08.2017    source источник
comment
Возможный дубликат Почему фильтр skimage не работает с плавающей запятой массив?   -  person iled    schedule 18.04.2018


Ответы (1)


Это должно помочь вам решить вашу проблему. Сначала я написал этот ответ на этот вопрос это было примерно такое же сообщение об ошибке, также для операции фильтрации.

В общем случае (и это справедливо для других языков программирования) изображение обычно может быть представлено двумя способами:

  • со значениями интенсивности в диапазоне [0, 255]. В этом случае значения имеют тип uint8 - целое число без знака 8-байт.
  • со значениями интенсивности в диапазоне [0, 1]. В этом случае значения имеют тип float.

В зависимости от языка и библиотеки типы и диапазон значений, разрешенных для интенсивности пикселей, могут быть более или менее допустимыми.

Ошибка здесь говорит вам, что значения пикселей вашего изображения имеют тип float, но они не находятся в диапазоне [-1, 1]. Если значения находятся между [0, 255] (или [-255, 255]), вам просто нужно разделить их все на 255. Преобразование значений в целые числа также может работать.

Это верно для изображений, представленных в виде обычных массивов (или матриц, в зависимости от языка). В вашем случае использование замаскированных массивов включает замаскированные значения, которые не являются ни числами с плавающей запятой, ни целыми числами. Следовательно, я сомневаюсь, что вы сможете использовать обычные функции фильтрации, если продолжите использовать маскированные массивы.

person Eskapp    schedule 15.08.2017
comment
Я добавил строки w1_masked_rescaled = w1_masked/255 print(np.any(w1_masked_rescaled › 1)) под объявлением w1_masked, но все равно получаю ту же ошибку. Где я должен делить на 255? - person Jim421616; 16.08.2017
comment
Я не думаю, что вы можете использовать замаскированные массивы... Если вы хотите использовать обычную функцию фильтрации, вам нужно будет заменить замаскированные значения допустимым значением, отслеживать положение замаскированных значений и добавить их обратно. .. В документации numpy.ma не упоминается никакая операция фильтрации... - person Eskapp; 16.08.2017
comment
Как насчет этого? docs.scipy.org/doc/numpy/reference/ сгенерировано/ - person Jim421616; 16.08.2017
comment
Это вычисляет медиану массива, он не выполняет операцию фильтрации, как вы представляете ее в своем вопросе (с элементом структурирования, который является диском). Если вы хотите сами закодировать операцию фильтрации (скользящий диск по замаскированному массиву), вы можете ее использовать. - person Eskapp; 16.08.2017