Ускоренный метод уменьшения массива изображений в Python с использованием numpy и pyfits
Я использую Python 2.7.3 с numpy и pyfits для обработки научных файлов FITS. Я бы хотел поработать над изображениями с половинным или четвертным разрешением ради скорости и иметь этот код:
# Read red image
hdulist = pyfits.open(red_fn)
img_data = hdulist[0].data
hdulist.close()
img_data_r = numpy.array(img_data, dtype=float)
# Scale it down to one quarter size
my=[]
for line in img_data_r[::4]:
myline=[]
for item in line[::4]:
myline.append(item)
my.append(myline)
img_data_r = my
Это работает, но мне интересно, есть ли более быстрый и более естественный способ уменьшить массив. Сокращения должны произойти как можно раньше, идея состоит в том, что данные, которые будут обрабатываться, имеют минимально приемлемый размер. Если бы был способ чтения сокращенного набора данных с помощью pyfits, это было бы идеально. Но такого метода, кажется, не существует (поправьте меня, если я ошибаюсь). Как насчет NumPy? Или scipy/ математика / что-нибудь еще?
1 ответ
Массив данных, из которого вы получаете pyfits
уже является массивом NumPy. Вам не нужно создавать его из этого. Кроме того, вы можете просто выполнить понижающую дискретизацию за один шаг:
img_data_r = hdulist[0].data[::4, ::4]
Это не будет копировать данные, а скорее просто скопировать новое представление с различными шагами. Если вам нужно изображение с пониженной частотой как непрерывный массив, используйте numpy.ascontiguousarray()
,
Этот метод понижающей дискретизации сохраняет только один из шестнадцати пикселей и полностью сбрасывает информацию во всех остальных пикселях. Если вам нужна более качественная понижающая дискретизация, чем делать это в своем коде, вам, вероятно, лучше уменьшить частоту дискретизации файлов FITS с помощью Imagemagick. Это также сократит время чтения файлов с диска.
Чтобы конвертировать все ваши файлы FITS в текущем каталоге на месте (предупреждение: большие версии перезаписываются), вы можете использовать
mogrify -resize 25% *.fits