画像ユーティリティ

概要

♪the astropy.nddata.utils モジュールは配列操作のための汎用ユーティリティ関数を含む.

2 Dクロッピング画像

スタート

♪the Cutout2D クラスは、2次元配列から切手クリップ画像を作成するために使用することができる。もしオプションの WCS オブジェクト入力は Cutout2D そして、そして Cutout2D オブジェクトには更新されたものが含まれます WCS 裁断アレイに対応しています

まず、2 Dデータアレイ上で単一の信号源をシミュレートする。複数の信号源をシミュレートしたい場合は、ご参照ください 境界枠付き効率的なモデルレンダリング それがそうです。

注意:ペアリング約束は size そして ポスト もういいよ。位置は(x,y)を指定するが,大きさは(y,x)を指定する.

>>> import numpy as np
>>> from astropy.modeling.models import Gaussian2D
>>> y, x = np.mgrid[0:500, 0:500]
>>> data = Gaussian2D(1, 50, 100, 10, 5, theta=0.5)(x, y)

画像を表示することができます

>>> import matplotlib.pyplot as plt
>>> plt.imshow(data, origin='lower')

(png, svg, pdf)

../_images/utils-1.png

次に、画像中の単一のオブジェクトの切り出しを作成することができる。位置の真ん中に裁断を作りました (x, y) = (49.7, 100.1) その大きさは (ny, nx) = (41, 51) ピクセル::

>>> from astropy.nddata import Cutout2D
>>> from astropy import units as u
>>> position = (49.7, 100.1)
>>> size = (41, 51)     # pixels
>>> cutout = Cutout2D(data, position, size)

♪the size キーワードでもいいです Quantity 対象::

>>> size = u.Quantity((41, 51), u.pixel)
>>> cutout = Cutout2D(data, position, size)

あるいは含まれています Quantity 対象::

>>> size = (41*u.pixel, 51*u.pixel)
>>> cutout = Cutout2D(data, position, size)

正方形のクロッピング画像は、整数またはスカラーを渡すことで生成することができます Quantity **

>>> size = 41
>>> cutout2 = Cutout2D(data, position, size)

>>> size = 41 * u.pixel
>>> cutout2 = Cutout2D(data, position, size)

クロッピング配列は data 属性の属性。 Cutout2D 例を挙げましょうもし…。 copy キーワードは False (デフォルト)、そして cutout.data 原作の一種の観賞になるだろう data 配列していますもし…。 copy=True そして、そして cutout.data 原本のコピーがあります。 data それがそうです。クロッピング画像をお見せしましょう

>>> cutout = Cutout2D(data, position, (41, 51))
>>> plt.imshow(cutout.data, origin='lower')

(png, svg, pdf)

../_images/utils-2.png

切り出しオブジェクトは、元のデータ上にその境界ブロックを描画することができる。 plot_on_original() 方法:

>>> plt.imshow(data, origin='lower')
>>> cutout.plot_on_original(color='white')

(png, svg, pdf)

../_images/utils-3.png

クロッピング配列の多くの属性も属性として格納されている:

>>> # shape of the cutout array
>>> print(cutout.shape)
(41, 51)

>>> # rounded pixel index of the input position
>>> print(cutout.position_original)
(50, 100)

>>> # corresponding position in the cutout array
>>> print(cutout.position_cutout)
(25, 20)

>>> # (non-rounded) input position in both the original and cutout arrays
>>> print((cutout.input_position_original, cutout.input_position_cutout))  
((49.7, 100.1), (24.700000000000003, 20.099999999999994))

>>> # the origin pixel in both arrays
>>> print((cutout.origin_original, cutout.origin_cutout))
((25, 80), (0, 0))

>>> # tuple of slice objects for the original array
>>> print(cutout.slices_original)
(slice(80, 121, None), slice(25, 76, None))

>>> # tuple of slice objects for the cutout array
>>> print(cutout.slices_cutout)
(slice(0, 41, None), slice(0, 51, None))

あと2つ Cutout2D 元の配列と切り出し配列との間で画素位置を変換する方法:

>>> print(cutout.to_original_position((2, 1)))
(27, 81)

>>> print(cutout.to_cutout_position((27, 81)))
(2, 1)

2 Dカットモード

There are three modes for creating cutout arrays: 'trim', 'partial', and 'strict'. For the 'partial' and 'trim' modes, a partial overlap of the cutout array and the input data array is sufficient. For the 'strict' mode, the cutout array has to be fully contained within the data array, otherwise an PartialOverlapError is raised. In all modes, non-overlapping arrays will raise a NoOverlapError. In 'partial' mode, positions in the cutout array that do not overlap with the data array will be filled with fill_value. In 'trim' mode only the overlapping elements are returned, thus the resulting cutout array may be smaller than the requested size.

デフォルトで使用する mode='trim' これにより、切断配列が要求よりも小さくなる可能性がある size **

>>> data2 = np.arange(20.).reshape(5, 4)
>>> cutout1 = Cutout2D(data2, (0, 0), (3, 3), mode='trim')
>>> print(cutout1.data)  
[[0. 1.]
 [4. 5.]]
>>> print(cutout1.shape)
(2, 2)
>>> print((cutout1.position_original, cutout1.position_cutout))
((0, 0), (0, 0))

使用 mode='partial' カットは決してしません代わりにいっぱいになります fill_value (デフォルト値は numpy.nan )トリミングがデータ配列に完全に含まれていない場合:

>>> cutout2 = Cutout2D(data2, (0, 0), (3, 3), mode='partial')
>>> print(cutout2.data)  
[[nan nan nan]
 [nan  0.  1.]
 [nan  4.  5.]]

注意してください 'partial' モードでは、位置(他のいくつかの属性)が 効き目がある (非パディング)切り出し値:

>>> print((cutout2.position_original, cutout2.position_cutout))
((0, 0), (1, 1))
>>> print((cutout2.origin_original, cutout2.origin_cutout))
((0, 0), (1, 1))
>>> print(cutout2.slices_original)
(slice(0, 2, None), slice(0, 2, None))
>>> print(cutout2.slices_cutout)
(slice(1, 3, None), slice(1, 3, None))

Vbl.使用 mode='strict' 裁断がデータ配列に完全に含まれていない場合、例外が引き起こされる。

>>> cutout3 = Cutout2D(data2, (0, 0), (3, 3), mode='strict')
PartialOverlapError: Arrays overlap only partially.

二次元裁断自 SkyCoord ポスト

入力 position 指定することもできます SkyCoord この場合には WCS 相手は通過しなければならない wcs キーワード。

まず私たちは SkyCoord 役職とa WCS 私たちのデータのオブジェクト(通常あなたのFITSタイトルから):

>>> from astropy.coordinates import SkyCoord
>>> from astropy.wcs import WCS
>>> position = SkyCoord('13h11m29.96s -01d19m18.7s', frame='icrs')
>>> wcs = WCS(naxis=2)
>>> rho = np.pi / 3.
>>> scale = 0.05 / 3600.
>>> wcs.wcs.cd = [[scale*np.cos(rho), -scale*np.sin(rho)],
...               [scale*np.sin(rho), scale*np.cos(rho)]]
>>> wcs.wcs.ctype = ['RA---TAN', 'DEC--TAN']
>>> wcs.wcs.crval = [position.ra.to_value(u.deg),
...                  position.dec.to_value(u.deg)]
>>> wcs.wcs.crpix = [50, 100]

今私たちは SkyCoord 位置和 wcs 対象::

>>> cutout = Cutout2D(data, position, (30, 40), wcs=wcs)
>>> plt.imshow(cutout.data, origin='lower')   

(png, svg, pdf)

../_images/utils-4.png

♪the wcs 属性の属性。 Cutout2D 対象には現在伝播されたものが含まれている WCS 配列を裁断するために用いられる。配列を裁断することで所定の画素の空座標を見つけることができますご注意ください、私たちは使用する必要があります cutout.wcs 切り出し位置の対象:

>>> from astropy.wcs.utils import pixel_to_skycoord
>>> x_cutout, y_cutout = (5, 10)
>>> pixel_to_skycoord(x_cutout, y_cutout, cutout.wcs)    
<SkyCoord (ICRS): (ra, dec) in deg
    ( 197.8747893, -1.32207626)>

元のファイルに対応する画素を見つけました data アレイとその空の座標:

>>> x_data, y_data = cutout.to_original_position((x_cutout, y_cutout))
>>> pixel_to_skycoord(x_data, y_data, wcs)    
<SkyCoord (ICRS): (ra, dec) in deg
    ( 197.8747893, -1.32207626)>

案の定、空の座標は原図の中にあります data 裁断アレイもこれに同意しています

角度を用いた2次元切り出し size

入力 size 指定することもできます Quantity 角度単位(例えば、度、角分、角秒など)で表される。本例では1つは WCS 相手は通過しなければならない wcs キーワード。

この例ではデータを使います SkyCoord 位置、そして wcs オブジェクトは、サイズ1.5 x 2.5角秒の切り出しを作成します。

>>> size = u.Quantity((1.5, 2.5), u.arcsec)
>>> cutout = Cutout2D(data, position, size, wcs=wcs)
>>> plt.imshow(cutout.data, origin='lower')   

(png, svg, pdf)

../_images/utils-5.png

更新されたWCSを使用してFITSファイルに2次元クロッピングを保存する

A Cutout2D オブジェクトは,切り出し領域の更新WCSオブジェクトを含む協調ファイルに保存することができる.本例では、FITS例画像をダウンロードし、切り出し画像を作成した。ここから生まれたのは Cutout2D そして,切り出し領域の更新されたWCSを含む新たなFITSファイルにオブジェクトを保存する.

# Download an example FITS file, create a 2D cutout, and save it to a
# new FITS file, including the updated cutout WCS.
from astropy.io import fits
from astropy.nddata import Cutout2D
from astropy.utils.data import download_file
from astropy.wcs import WCS


def download_image_save_cutout(url, position, size):
    # Download the image
    filename = download_file(url)

    # Load the image and the WCS
    hdu = fits.open(filename)[0]
    wcs = WCS(hdu.header)

    # Make the cutout, including the WCS
    cutout = Cutout2D(hdu.data, position=position, size=size, wcs=wcs)

    # Put the cutout image in the FITS HDU
    hdu.data = cutout.data

    # Update the FITS header with the cutout WCS
    hdu.header.update(cutout.wcs.to_header())

    # Write the cutout to a new FITS file
    cutout_filename = 'example_cutout.fits'
    hdu.writeto(cutout_filename, overwrite=True)


if __name__ == '__main__':
    url = 'https://astropy.stsci.edu/data/photometry/spitzer_example_image.fits'

    position = (500, 300)
    size = (400, 400)
    download_image_save_cutout(url, position, size)