画像データ

本章では,ミラーHDUにおけるデータコンポーネントについて議論する.

画像データを配列とする

FITSマスタHDUまたは画像拡張HDUは、画像データを含むことができる。以下では,この2つのHDUクラスに適用することを検討する.ほとんどの場合 astropy これは一種の numpy 配列は、NAXISキーワードによって指定された形状と、BITPIXキーワードによって指定されたデータタイプとを有する-データがスケーリングされていない限り、この場合は次節を参照されたい。次にFITS画像で許されるBITPIX値と numpy データタイプ:

BITPIX    Numpy Data Type
8         numpy.uint8 (note it is UNsigned integer)
16        numpy.int16
32        numpy.int32
64        numpy.int64
-32       numpy.float32
-64       numpy.float64

簡単に言うと numpy 配列は0インデックスであり,軸は遅い順にソートされる.したがって,画像のNAXIS 1=300とNAXIS 2=400をフィッティングすると numpy そのデータ配列は(400,300)の形状を有するであろう.

実例.

以下に画像データ値の読み取りと更新の概要を示す:

>>> from astropy.io import fits
>>> fits_image_filename = fits.util.get_testdata_filepath('test0.fits')

>>> with fits.open(fits_image_filename) as hdul:  # open a FITS file
...     data = hdul[1].data  # assume the first extension is an image
>>> print(data[1, 4])   # get the pixel value at x=5, y=2
313
>>> # get values of the subsection from x=11 to 20, y=31 to 40 (inclusive)
>>> data[30:40, 10:20]
array([[314, 314, 313, 312, 313, 313, 313, 313, 313, 312],
       [314, 314, 312, 313, 313, 311, 313, 312, 312, 314],
       [314, 315, 313, 313, 313, 313, 315, 312, 314, 312],
       [314, 313, 313, 314, 311, 313, 313, 313, 313, 313],
       [313, 314, 312, 314, 312, 314, 314, 315, 313, 313],
       [312, 311, 311, 312, 312, 312, 312, 313, 311, 312],
       [314, 314, 314, 314, 312, 313, 314, 314, 314, 311],
       [314, 313, 312, 313, 313, 314, 312, 312, 311, 314],
       [313, 313, 313, 314, 313, 313, 315, 313, 312, 313],
       [314, 313, 313, 314, 313, 312, 312, 314, 310, 314]], dtype=int16)
>>> data[1,4] = 999  # update a pixel value
>>> data[30:40, 10:20] = 0  # update values of a subsection
>>> data[3] = data[2]    # copy the 3rd row to the 4th row

以下は、“マスク配列”概念を使用するいくつかのより複雑な例である。第1の例は、変更中のすべての負画素値である data ゼロにする。第2の方法は、正の画素値の対数をとることである:

>>> data[data < 0] = 0
>>> import numpy as np
>>> data[data > 0] = np.log(data[data > 0])

これらの例は numpy 配列操作。

データをスケーリングする

画像をスケーリングする場合があり、すなわち、ファイルに格納されているデータは、画像の物理的(真)値ではなく、以下の式に従って線形変換される。

physical value = BSCALE * (storage value) + BZERO

BSCALEとBZEROは同名キーワードとして同一のHDUのヘッダに格納される.スケーリング画像の最も一般的な用途は、FITS規格がそうすることを許可しないので、符号なし16ビット整数データを格納することである。本例では、格納されたデータは、シンボル付き16ビット整数(BITPIX=16)、BZERO=32768である。 (\(2^{{15}}\) )、BSCALE=1。

ズーム画像データの読み込み

画像は、タイトル中にBSCALE/BZEROキーワードが存在し、その値のうちの1つがデフォルト値(BSCALE=1、BZERO=0)でない場合にのみスケーリングされる。

スケーリングされていないデータの場合、HDUのデータ属性 astropy これは numpy BITPIXキーワードで指定された同じデータタイプの配列.ズーム画像の場合は .data 属性は、物理データである(すなわち、格納データから変換され、BITPIXに規定されているデータタイプとは異なる場合がある)。これは追加のコピー手順が必要であることを意味し,それに応じたメモリ要求が必要である.これは,スケーリングされたデータに対してメモリマッピングの利点が低下することを意味する.

浮動小数点格納データの場合、スケーリングされたデータは同じデータタイプを持つ。整数型データタイプでは,スケーリングされたデータはつねに単精度浮動小数点である. (numpy.float32 )。

例を引く

以下の例は、データをタッチする前および後に、スケーリングデータがどのように発生するかを示す。

>>> fits_scaledimage_filename = fits.util.get_testdata_filepath('scale.fits')

>>> hdul = fits.open(fits_scaledimage_filename)
>>> hdu = hdul[0]
>>> hdu.header['bitpix']
16
>>> hdu.header['bzero']
1500.0
>>> hdu.data[0, 0]  # once data is touched, it is scaled  
557.7563
>>> hdu.data.dtype.name
'float32'
>>> hdu.header['bitpix']  # BITPIX is also updated
-32
>>> # BZERO and BSCALE are removed after the scaling
>>> hdu.header['bzero']
Traceback (most recent call last):
    ...
KeyError: "Keyword 'BZERO' not found."

警告

ズームデータを処理する際に注意すべき重要な注意事項の1つ astropy 通過するときのことです .data 属性の場合,データはBZEROとBSCALEパラメータを用いて自動的にスケーリングされる.ファイルが“更新”モードで開いている場合、再スケーリングされたデータと共に保存されます。この驚くべき行為は,データを何らかの浮動小数点計算を行うと,保存時に再スケーリングすると情報損失を招く可能性があるデータを失わないように妥協するためである.

この自動ズームを防ぐためには、ご利用ください do_not_scale_image_data=True はいの論点です。 fits.open() それがそうです。これは、データが修正されないことを保証しながら、いくつかのヘッダ値を更新するために特に有用である。

手動でスケールパラメータを再適用することもできます hdu.scale() (下記参照)。あるいは、ご利用いただけます scale_back=True 論争する。これは,物理値が更新されても,保存時に元のスケーリングを保持することを保証している.言い換えると,保存時にスケーリングを新たな物理値に再適用する.

ズーム画像データの書き込み

追加の処理とメモリ要求のため、スケーリング·データの使用を可能な限り奨励しません。しかし、 astropy コントロールは、スケーリングデータを書き込む方法を提供する。 scale 方法です。

実例.

ズームデータを書き込むために、ご利用ください scale 方法:

>>> # scale the data to Int16 with user specified bscale/bzero
>>> hdu.scale('int16', bzero=32768)
>>> # scale the data to Int32 with the min/max of the data range, emits
>>> # RuntimeWarning: overflow encountered in short_scalars
>>> hdu.scale('int32', 'minmax')  
>>> # scale the data, using the original BSCALE/BZERO, emits
>>> # RuntimeWarning: invalid value encountered in add
>>> hdu.scale('int32', 'old')  
>>> hdul.close()

上記の第1の例は、符号なし短い整数配列をどのように格納するかを示している。

Caution must be exercised when using the scale() method. The data attribute of an image HDU, after the scale() call, will become the storage values, not the physical values. So, only call scale() just before writing out to FITS files (i.e., calls of writeto(), flush(), or close()). No further use of the data should be exercised. Here is an example of what happens to the data attribute after the scale() call:

>>> hdu = fits.PrimaryHDU(np.array([0., 1, 2, 3]))
>>> print(hdu.data)  
[0. 1. 2. 3.]
>>> hdu.scale('int16', bzero=32768)
>>> print(hdu.data)  # now the data has storage values
[-32768 -32767 -32766 -32765]
>>> hdu.writeto('new.fits')

データセグメント.

HDUに適した画像を見ると data アクセス時には、データ全体をメモリにコピーするか(メモリマッピングを使用しない場合、またはデータがスケーリングされている場合)、データサイズに等しい仮想メモリ空間を割り当てるか(データのメモリマッピングをスケーリングしていない場合)。複数の非常に大きな画像HDUに同時にアクセスすると、システムはメモリを枯渇させる可能性がある。

ユーザが画像全体(例えば、画像10ラインを一度に処理する)を同時に処理する必要がない場合、 section HDUの属性を使用して、このようなメモリ問題を緩和することができます。

使用 astropy メモリマッピングのサポートが改善されているため、非常に大きな画像を処理するためには、Sections機能は従来ほど必要ではない。しかし、非常に重要なBSCALE/BZEO値を用いて画像のデータをスケーリングすると、現在の実現ではSections中のデータにアクセスする必要がある可能性がある。Memmapも32ビットシステム上で2 GBから4 GB以上の画像をロードするには不十分である-この場合、Sectionsを使用する必要があるかもしれない。

例を引く

以下は、サイズ5000 x 5000の3つの入力画像から中央値画像を取得する例である。

hdul1 = fits.open('file1.fits')
hdul2 = fits.open('file2.fits')
hdul3 = fits.open('file3.fits')
output = np.zeros((5000, 5000))
for i in range(50):
    j = i * 100
    k = j + 100
    x1 = hdul1[0].section[j:k,:]
    x2 = hdul2[0].section[j:k,:]
    x3 = hdul3[0].section[j:k,:]
    output[j:k, :] = np.median([x1, x2, x3], axis=0)

各データベースのデータ section 連続している必要がなければ、メモリを節約することができます。 astropy 配列の不連続部分をできるだけ少なくして主記憶に読み込むように最善を尽くす.

現在は節を割り当てることができない.データフェスティバルに対するどんな修正も元のファイルに保存されません。