본문으로 바로가기

4차인재 양성사업

과학기술 빅데이터 분석가 과정 

한국천문연구원 최성환

 

 

 

fitsfile.FitsFile()

패키지명?클래스와 같은 이름의 펑션이 실행되면 클래스 내부에 정의된 함수가 아니고

__init__파트가 실행이 된다.

 

f1 =  fitsfile.FitsFile()

d1 = f1.loadfile("aia.~~~~.fits")

 

FitsFile 안의 __init__을 보면 return이 없는데 이 부분은 예외적으로

ㅡㄹ래스 내부의 인스턴스(변수)가 반환되도록 약속되어있는 예외적인 파트라고 한다. 함수는 늘 리턴값이 있는데 예외적인 부분?

 

첫번째 라인 실행결과는 즉 f1에 FitsFile() 내부 인스턴스가 담긴 상태

 

f1.load_file 이면 f1이 갖고 있는 load_file을 실행한다는 뜻.

로드를 해도 d1을 출력하면 False가 나오는데, load 실행 결과를 불리엔으로 준다고 생각할 수 있으며

로드된 데이터는 f1의 멤버에 저장되어 있다고 이해할 수 있다. ..멤버?

 

이걸 활용하고 싶다면 if문 끼워넣어서 파일 로드가 실패하면 경고창을 띄우고 그 밑을 실행 안 하는 식으로

그게 꼭 좋은 코드라고 할 수는 없지만 사용자가 쓰기에는 더 좋은 코드를 짤 수 있다.

(돈 받고 파는 프로그램에는 그정도는 해 줘야한다고..ㅋㅋㅋㅋ)

 

로그까지 취해서 newer - older한 이미지를 뿌리니 사이즈도 작고 노이즈도 자글자글

우리는 diff = newer - older로,

이미지를 출력하는건 min과 max에 대해서 그 사이 값들을 화면에 뿌리는 것이라 설명했었다.

그런데 우리는 지금  min과 max의 중간이 0인 지점, 즉 newer - older 한 값이 0인 지점을 기준으로 이미지를 출력해서

얼마나 더 밝아지고 얼마나 더 어두워졌는지 그 차이를 출력하고자 하는데

앞서 older와 newer의 데이터값을 출력해보았을 때 vmin과 vmax는 완벽히 일치하지 안았다.

그러니 그 둘을 뺀 값인 diff의 min과 max의 중간지점 역시 0이라는 보장은 할 수가 없고 오히려 치우치지 않았을까 걱정해야 한다.

이 부분을 짚고 넘어가기로 한다.

 

여기서는 diff의 0을 기준으로 min과 max까지의 범위를 abs(absolute)값을 구해서 더 넓은 범위를 기준으로

반대편으로 그만큼 확장시켜주어서 범위를 확장시키고 중심을 0으로 맞추어 준다.

이렇게 최솟값 최댓값의 절댓값이 같도록 보정이 되었다.

im = plt.imshow(diff , cmap = cm.jet, vmin=vmin, vmax=vmax)

 

diff는 우리 변수, cmap = cm.jet은 둘 다 안의 변수, vmin과 vmax의 오른쪽은 우리 변수인데 그 왼쪽은?

매개변수? 옵션? 혹자는 아규먼트. 이 구체적인 차이는 뭐고 왜 diff 는 그냥넣어도 되는데 vmin vmax 는 = 하고 써야하나.

def F (a, b, c)가 있고 F(3, 4, 1) 처럼 함수를 실행하는 순간

a = 3

b = 4

c = 1 

의 변수를 만드는 행위가 컴퓨터 단위에서 이루어진다.

ax.imshow코드에서 cmap, vmin, vmax(왼쪽들)은 함수 내에서 쓰는 변수 명이고

그 오른쪽은 우리가 만든 변수 명인 것이다.

 

 

양변 로그를 취하지 않은 diff에 대해서는 vmin과 vmax가 같도록 잘 바뀌었었는데

로그를 취하니 두 값이 다르게 나오는 것을 발견했다.

vmin과 vmax를 abs값을 구해 그 값 중 max값을 찾아 vmin과  vmax를 재설정해주는 과정에서

vmin = abs(vmin)으로 초기화한 값을 그대로 -max(vmin, vmax)로 넣은 탓에 abs값이 아닌, abs값 중 최댓값의 음수값이 들어간 vmin으로  vmax를 찾는 꼴이 되었기 때문에 문제가 생긴 것이다. 즉, 처음에는 우연히 값이 잘 구해진 것이지 제대로 된 코드가 아닌 것이다.

그래서 왼쪽 코드를 오른쪽처럼 수정해,  abs값 중 큰값을 v변수를 새로 만들어 저장해서 이 값으로 vmin과 vmax를 초기화시켜주었다.

 

##tanh함수에서 diff를 v로 나누었으니까 x축기준 -1~1로 데이터가 분포할 것.

여기선 너무 범위가 좁아질 것 같아서 조금 더 늘리력 범위를 3 곱해서 -3~3 범위까지로 늘린것.
##imshow에서 vmin과 vmax를 지정해준건 tanh함수의 특성을 아니까 출력 범위를 지정해준 것.
## sigmoid function(여기선 tanh)에서 x축이 inputdata y축이 output data.

위 과정을 거쳐서 출력하면 (그리고 보려던 일부를 확대하면) 아래처럼 나온다

 



 

기본적으로 컴퓨터에서 이미지는 왼쪽 위가 (0, 0)

아닐 수도 있고 바꿔서 진행하고 싶을 수도 있으니 궁금하다면 확인하고 가야함.

 

왼쪽처럼 r(여기선 2048)로 훑으면 (0,0)포함이 안되니

포함하고 싶다면 r값을 바꿔서 진행하면 된다. 상황 따라 바꾸어야함.

 

기본적으로 사인, 코사인 함수에는 세타가 아니라 라디안으로 들어간다.

라디안은 유닛(단위)을 가지지 않기 때문에 유닛을 맞춰주려고 라디안 사용 한다고 한다. 스케일을 맞춰주려고 할 때 스케일을 맞춰주기에 라디안을 써야 알아서 딱 맞게 잘 되지 세타를 쓰면 이게 안맞는다고 한다.

 

 

for문이 어떻게 도는지 뭐가 출력되는건지 꼼꼼히 알아야 한다. 코딩은 머리로 하는게 아니다.
dst[r, theta] = src[y, x] 를 바로 했을때에 대한 에러. 형변환 필요.

 

 

 

x = 2048 + r * math.sin(theta/1000.0) y = 2048 + r * math.cos(theta/1000.0)
x = 2048 + r * math.sin(theta/1000.0) y = 2048 - r * math.cos(theta/1000.0)

y는 +해주냐 -해주냐에 따라 예제 그림처럼 0 degree에서 시작해서 픽셀을 뽑아오느냐 180도 반대 방향에서 뽑아오느냐가 바뀐다.

 

dst[r, theta] = src[y, x] 해주는것처럼 y, x 순서인건 언어에 따라 y먼저 스캔하는지 x먼저 스캔한느지가 언어에 따라 다르다고 함.

fits 이미지 자체가 뒤집힌 이미지였다는 것을 우선 간과했었다고 한다.

fitsfile 자체를 뒤집어 줘야 제대로 된 이미지가 나오는게 맞다고 한다. 그래서 여기선 2047-r을 해주어야 위아래가 제대로 나오는것.

 

fits_test3.py
0.00MB

KISTI 빅데이터 분석가 과정데이터분석카테고리의 다른글

재난재해 데이터 #2  (0) 2019.07.23
재난재해 데이터 #1  (0) 2019.07.22
천문데이터 #3  (0) 2019.07.17
천문데이터 #1, #2  (0) 2019.07.15
교통 데이터 실습  (0) 2019.07.08