-1

処理後のファイルサイズに問題があります...編集された画像を作成するスクリプトを書きました...(生の画像データからフラットフィールド画像データと暗い画像データを差し引きます)...ここにコードがあります float NumPy配列をビッグエンディアンに変換して私の問題は...最初は、サイズが2.8MiBでタイプ> 2iのファイルに適合しています...処理後、11MiBでタイプがfloat64の適合ファイルがありますが、理由がわかりませんか? IDL には、いくつかの修正方法http://www.exelisvis.com/docs/FIX.htmlがあります。Python では imgg=imgg.astype(np.int16,copy=False) を使用します。したがって、2.8MiB の画像ファイルを取得しますが、白と黒のみ...

何か提案はありますか?

4

1 に答える 1

1

http://docs.astropy.org/en/stable/io/fits/appendix/faq.html#why-is-an-image-containing-integer-data-being-converted-unexpectedly-to-floatsから

イメージのヘッダーに、オプションの BSCALE および/または BZERO キーワード (つまり、BSCALE != 1 および/または BZERO != 0) の重要な値が含まれている場合、ファイル内の生データを物理的なサイズに再スケーリングする必要があります。式による値:

physical_value = BZERO + BSCALE * array_value

BZERO と BSCALE は浮動小数点値であるため、結果の値も浮動小数点数でなければなりません。元の値が 16 ビット整数の場合、結果の値は単精度 (32 ビット) 浮動小数点数になります。元の値が 32 ビット整数の場合、結果の値は倍精度 (64 ビット浮動小数点) になります。

この自動スケーリングは、HDU のデータ部分にアクセスする (データを再スケーリングせずにヘッダーを更新するなどの処理を可能にする) までは行われないため、予期していない場合は簡単に油断してしまう可能性があります。例えば:

>>> hdul = fits.open('scaled.fits')
>>> image = hdul['SCI', 1]
>>> image.header['BITPIX']
32
>>> image.header['BSCALE']
2.0
>>> data = image.data  # Read the data into memory
>>> data.dtype
dtype('float64')  # Got float64 despite BITPIX = 32 (32-bit int)
>>> image.header['BITPIX']  # The BITPIX will automatically update too
-64
>>> 'BSCALE' in image.header  # And the BSCALE keyword removed
False

これは、ユーザーがデータにアクセスすると、データを操作して計算を実行する可能性があるためです。データが整数のままであることを余儀なくされた場合、かなりの精度が失われます。したがって、最初は多少の混乱を招くという代償を払って、データを失わないという側で誤りを犯すのが最善です。

保存する前にデータを整数に戻す必要がある場合は、ImageHDU.scale メソッドを使用します。

>>> image.scale('int32')
>>> image.header['BITPIX']
32

または、mode='update' と scale_back=True 引数を指定してファイルを開くと、保存前に元の BSCALE および BZERO スケーリングがデータに自動的に再適用されます。通常、これは望ましくありません。特に、浮動小数点から符号なし整数値に変換する場合は特にそうです。ただし、これは、物理値の変化に対応して生データを変更する必要がある場合に役立ちます。

再スケーリングがまったく発生しないようにするには (ヘッダーを更新するのに適しています。コードがデータにアクセスするつもりがない場合でも、ここで注意を怠るのは良いことです)、ファイルを開くときに do_not_scale_image_data 引数を使用します。

>>> hdul = fits.open('scaled.fits', do_not_scale_image_data=True)
>>> image = hdul['SCI', 1]
>>> image.data.dtype
dtype('int32')
于 2015-07-22T14:55:44.677 に答える