정보 과학융합탐구

python을 이용하여 말머리성운의 fits파일 구현하기

Halfand 2023. 5. 19. 07:59

https://himbopsa.tistory.com/26

 

[Python] 허블 아카이브를 이용한 '폭발적 항성 생성 은하' 이미지 표출하기 (Expressing images of 'Starbur

안녕하십니까, 새로운 글로 찾아뵙게 된 AstroPenguin입니다~~(격한환영) 여태까지의 게시물들에서는 공식이나 관계를 활용한 그림 또는 그래프를 표출하였다면 이번에는 직접적으로 천체의 이미

himbopsa.tistory.com

https://himbopsa.tistory.com/32

 

[Python] 허블 아카이브를 이용한 '폭발적 항성 생성 은하' 이미지 표출하기 (Expressing images of 'Starbur

himbopsa.tistory.com/26 [Python] 허블 아카이브를 이용한 '폭발적 항성 생성 은하' 이미지 표출하기 (Expressing images of 'Starbur 안녕하십니까, 새로운 글로 찾아뵙게 된 AstroPenguin입니다~~(격한환영) 여태까

himbopsa.tistory.com

 

* 들어가기 전, 위 두 글에게 많은(매우 많은!) 도움을 받았음을 명시합니다!! 

 

 

 

안녕하세요. python으로 fits 파일 구현하기 2번째 시간입니다. 

아직도 미숙하지만 그래도 점점 뭔가 알아가고 있는 것 같아요. 

이모씨 또 댓글로 어그로 끌면 임종시키겠습니다.

 

 

1. 배경이론

 

구현한 성운들

말머리성운

IC 434

05h 40m 59.0s

-02° 27′ 30.0″

교과서 사골
오리온 허리띠 가장 아래쪽 별 알니탁 부근에 Horsehead Nebula라고 쓰여 있는게 보이시나요?

 

게성운

M1, NGC 1952

05h 34m 31.97s

+22° 00′ 52.1″

교과서 사골222
게성운은 활소자리 뿔의 끝 쪽 부분에 위치하고 있습니다.

고양이 눈 성운

NGC 6543

17h 58m 33.423s

+66° 37' 59.52

고양이 눈 성운의 위치는 마치 용이 휘감고 있는 것 같은 모습입니다.

 

고리성운

M57

18h 53m 35.079s

+33˚ 01´ 45.03˝ 

고리성운은 거문고자리 베타와 감마 사이에 위치하고 있습니다.

 

 

너무 예쁘지 않나요.... 아니라고요?

 

너무 예쁘죠? 네 잘 알겠습니다^^

 

 

위 성운들은 다들 교과서든, 아니면 어디서든 한 번쯤은 봐 본 유명한 성운들이라 생각해서 골랐습니다. 그리고 유명한 성운으로 골라야 자료가 많더라고요..

 

(그런데 사실 여러분이 잘 기억하셔야 할 게, 실제로 망원경으로 성운을 보면 저런 색이 나오지 않습니다. 다 어떤 색이 어울릴까 고민해서 포토샵으로 편집한 것이라는거....)

 

 

허블 아카이브

허블 우주 망원경으로 관측된 데이터들은 fits 파일의 형태로 허블 아카이브에 저장됩니다. 저장된 성운 이미지 데이터를 다운 받아 파이썬을 통해 사진으로 구현하는거죠

 

자료 다운로드 방법

1. 인터넷에 허블 아카이브를 검색한다
2. 메시아 번호나 적경, 적위를 입력한다.  ex) M1 or 05 34 31.97 +22 00 52.1
3. 검색창 왼쪽 조금 아래에 images를 누르고 마음에 드는 자료를 찾는다.
4. fits 파일을 다운로드 한다.

 

 

 

2. 파이썬으로 여는 과정

 

저번에 이어 이번에도 말머리 성운 사진을 한 번 구현해 보았습니다. 그 과정을 한 번 천천히 살펴보시죠!

 

import astropy.io.fits as fits
import numpy as np
import matplotlib.pyplot as plt

image_file = "D:/Solusseum/Users/user/Desktop/hlsp_heritage_hst_wfc3-ir_horsehead_f110w_v1_drz-sci_sci.fits"
galaxy_data = fits.open(image_file)
print(galaxy_data.info())
만약 astropy와 matplotlib가 없다고 뜬다면?

1.당황하지 말고 일단 윈도우창에 cmd를 입력하세요.
2. pip install astropy와 pip install matplotlib를 입력하시면 끝!

파일 경로를 모르겠다면, 그 파일에 마우스를 대고 우클릭을 하셔서 속성에 들어간 뒤 복사해오시면 됩니다. 복사해 오신다면 \가 있을텐데, 이를 모두 /로 바꿔주셔야 합니다. (위치블라블라)/(파일명블라블라).fits 형태를 image_file에 저장하였습니다.

 

그후 데이터에 무엇이 들었는지 알아보기 위해 print로 galaxy_data의 정보를 출력합니다

 

출력을 하면 이런 창이 뜨는데요. 여기서 PrimaryHDU에 2차원 정보가 저장되어 있기 때문에, 우리는 저것을 이용하여 사진을 만들 겁니다. 

 

image=galaxy_data[0].data
header=galaxy_data[0].header

print("info", header["PHOTMODE"])
print("deg/pixel", header["CD2_2"])

#info WFC3 IR F110W
#deg/pixel -8.0176262658441e-06

image와 header에 galaxy_data[0]을 저장한 이유는 PrimaryHDU가 0번째 행이기 때문

 

header: 제목? 같은 느낌. 

data: 실제 관측 데이터

 

출력하면 주석처리 된 값이 뜹니다.

윗줄은 촬영 기기와 관측 파장(nm)

밑줄은 1픽셀당 각도입니다.

 

여기서 사전에 확인해야 할 정보의 확인은 끝났습니다.

 

 

 

이제 실제로 말머리 성운을 사진으로 나타내 볼 차례인데요.

IC434_image=np.array(image)

max_value=np.percentile(image, 99)
min_value=np.percentile(image, 60)

plt.figure(figsize=(8,8))
plt.imshow(image, cmap='cividis', origin='lower', vmax=max_value, vmin=min_value)
plt.show()

일단 출력을 하기 위해, np.array를 통해 자료를 2차원 array형식으로 바꾸어 줍니다.

그 후 최댓값과 최솟값을 정하기 위해 np.percentile를 사용하여 값을 정해줍니다. 

 

*np.percentile란? 픽셀값 중에서 분위수에 해당하는 값을 구하는 수

즉 image, 99는 백분위 99%, 즉 상위 1%의 밝기, 60은 60%, 상위 40%의 밝기를 말합니다. 

 

이제 사진의 사이즈와 cmap, origin(원점의 위치), 최대, 최소 값을 입력한 후, plt.show()합니다.

 

그러면 결과로 이렇게 생긴 말머리 성운 사진이 나오게 됩니다!!! 짜잔!!!!!

 

색이 조금 밋밋한 것 같으니 cmap의 값을 다른 걸로 바꿔보도록 하겠습니다.

 

 

 

 

각각 magma, viridis, plasma, inferno, cividis로 cmap을 설정한 값이에요.

 

 

최종 코드

import astropy.io.fits as fits
import numpy as np
import matplotlib.pyplot as plt

image_file = "D:/Solusseum/Users/user/Desktop/hlsp_heritage_hst_wfc3-ir_horsehead_f110w_v1_drz-sci_sci.fits"
galaxy_data = fits.open(image_file)

image=galaxy_data[0].data
header=galaxy_data[0].header

#print("info", header["PHOTMODE"])
#info WFC3 IR F110W
#deg/pixel -8.0176262658441e-06
#print("deg/pixel", header["CD2_2"])

M1_image=np.array(image)

max_value=np.percentile(image, 99)
min_value=np.percentile(image, 60)

plt.figure(figsize=(8,8))
plt.imshow(image, cmap='cividis', origin='lower', vmax=max_value, vmin=min_value)
plt.show()

 

만드는데 어려운 점

글쎄요... 대신 이제 스스로 파일을 읽을 수 있게 되었기 때문에 구현하고 싶은게 있다? 샤샷샥 해서 구현하면 끝! 이게 되었씁니다.

사실 다른 파일들도 구현하려고 했는데... 정보실 컴퓨터가 껐다 켜면 프로그램 깔아놨던게 다 지워져서 그냥 말머리성운만 하게 되었습니다. 절대로 귀찮았던게 아닙니다

 

 

이번에 한 건 어제 배웠던 데이터 자료 구현하고 많이 연관되어 있어서 좋았습니다. 쏘해피

 

어렵지 않으니 다들 한 번 구현해 보시기를 바랍니다!