Ускоренный метод уменьшения массива изображений в 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
Другие вопросы по тегам