퐈니썬's LIfe - 잘 실패하자 RSS 태그 관리 글쓰기 방명록
Programming (12)
2021-06-28 11:10:56
728x90
반응형

01. 파이썬 클래스 (Class)란?

클래스는 어떤 것이고 왜 필요할까?

01.1. 클래스의 개요

  • 클래스는 객체의 구조와 행동을 정의한다.
  • 객체의 클래스는 초기화를 통해 제어한다.
  • 클래스는 복잡한 문제를 다루기 쉽게 한다.

 

💡메모

객체란, 어떠한 속성의 값, 행동을 가지는 데이터를 일컫습니다. 파이썬에서 숫자, 문자, 함수 등등 모든 데이터들은 여러 속성과 행동을 가지고 있고 각각이 객체라 볼 수 있습니다.

예시)

세탁기라는 객체는 "빨래를 한다", "빨래 정지한다", "가로 100cm" 등의 속성과 행동으로 표현할 수 있습니다. 이렇든 정의된 데이터가 속성과 행동을 가진다면 객체라고 말할 수 있겠네요!

 

클래스는 위와 같은 특성을 가지는데요, 왜 그러한지에 대해 차근차근 보겠습니다.

 

02. 클래스는 복잡한 문제를 다루기 쉽게 한다?

아래의 예시를 통해 이를 확인 할 수 있습니다.

클래스를 통해 복잡하게 반복해야하는 행동을 쉽게 정의하여 해결 할 수 있습니다.

 

곱셈 계산 기능을 가지는 계산 프로그램 multiply가 있습니다.

이 계산 프로그램은 현재 까지 입력된 모든 숫자들의 곱을 구해야합니다.

예시)

result = 1

def multiply(num):
    global result
    result *= num
    return result

print(multiply(3))
print(multiply(4))
print(multiply(6))

[out]
3
12
72

 

그런데, 어떠한 상황에서 multiply의 기능을 하는 계산 프로그램이 두개가 필요하다고 생각해봅시다.

예를들어, 1 x 4 x 10 라는 연산과 20 x 4 라는 연산을 한번에 진행해야 할 때, 이러한 상황을 고려해보면 위 와같은 multiply 프로그램을 multiply_1, multiply_2와 같이 두개를 만들어야 합니다.

 

예시)

result_1 = 1
result_2 = 1

def multiply_1(num):
    global result_1
    result_1 *= num
    return result_1

def multiply_2(num):
    global result_2
    result_2 *= num
    return result_2

print(multiply_1(1))
print(multiply_1(4))
print(multiply_1(10))

print(multiply_2(20))
print(multiply_2(4))

[out]
1
4
40
20
80

 

좋습니다. 2개까지는 충분히 만들 수 있을거 같습니다. 하지만, 5개, 20개 혹은 그이상이 필요할 때는 어떻게 해야할까요, 하나하나 직접 구현 하는 것은 굉장히 복잡하고, 비효율적입니다.

여기서! 클래스는 이러한 상황을 매우 간단하게 해결합니다!

 

예시)

#Multiply 클래스 생성
class Multiply:
    def __init__(self):
        self.result = 1
    
    def multiply(self, num):
        self.result *= num
        return self.result

# 클래스를 통한 계산기 1 
multiply_1 = Multiply()
print("계산기 1 결과")
print(multiply_1.multiply(2))
print(multiply_1.multiply(5))

# 클래스를 통한 계산기 2
multiply_2 = Multiply()
print("계산기 2 결과")
print(multiply_2.multiply(10))
print(multiply_2.multiply(9))

 

위와 같이 Multiply라는 클래스를 생성하여, multiply_1, multiply_2의 인스턴스를 형성하여 사용할 수 있습니다!

많이 비유되는 거처럼, 클래스는 마치 틀, 공장과 같은 역할을 해서 자신의 형태 결과물인 인스턴스를 만들어냅니다!

 

3. 객체의 클래스는 초기화를 통해 제어?

클래스를 생성하고 생성된 클래스를 인스턴스로 형성하여 반복적으로 기능을 할 수 있는 것이 클래스의 특징인데요, 여기서 항상 들어가는 "__init__()" 이라는 함수가 있습니다.

이는 생성자라하며, 인스턴스가 생성될때 항상 실행되는 것입니다.

즉, 위의 Multiply라는 클래스를 통해, Multiply_1, Multiply_2 라는 두개의 인스턴스가 생성되었는데요, 생성할때마다 __init__() 함수가 실행되면서 모두 self.result = 1이라는 문장을 실행합니다.

 

즉, result라는 변수를 인스턴스 형성때마다 초기화가 됩니다. 이러한 장점은 많은 변수를 추가할 필요없게 합니다.

 

💡메모

클래스에는 생성자와 소멸자라는 개념이 있습니다.

생성자는 위에서 설명한 "__init__()"에 해당되며, 이 생성자를 통해서 객체가 생성될때 어떤 변수의 값을 세팅하는 등 여러가지 작업을 할 수 있습니다.

반면에, "__del__()" 라는 소멸자는 리소스 해제등의 종료 작업을 하기위해 사용됩니다.

 

#Multiply 클래스 생성
class Multiply:
    def __init__(self):
        self.result = 1
    
    def multiply(self, num):
        self.result *= num
        return self.result

#클래스가 인스턴스로 형성될 때마다 __init__() 함수는 실행된다. 
#즉 result 인스턴스 형성 마다 개별적으로 초기화

4. 클래스는 객체의 구조와 행동을 정의?

이 특징은 위를 잘 읽으셨다면 충분히 이해 하실 겁니다.

즉, 어떠한 객체에 대해 복잡한 구조를 만들 필요 없이 클래스를 통해서 객체에 대한 행동과 속성을 구조화 시켜 간단하게 해결 할 수 있습니다!!

 

 

728x90
반응형
2021-06-25 15:31:11
728x90
반응형

01. 서문

최근에 DICOM 이미지를 축대칭을 하는 과정에서 numpy의 flip 메소드를 편하게 사용하여 작성합니다. 물론, 일반 이미지의 경우, cv2의 flip기능을 사용해도 편합니다.

다만, DICOM 의 array만 받아서 처리할때 배열을 다루는 numpy 함수를 사용했던 것을 메모차 작성합니다.

도움이 된다면 좋겠습니다.

02. 이미지 축 대칭

대칭에는 여러가지가 있지만, 본 포스트에서는 "반사대칭" 즉, 차원에 대한 대칭에 대해 다루었습니다.

2 차원에는 대칭축 (일명 대칭 선)이 있고 3 차원에는 대칭 평면이 있습니다.

모든 점에 대해 공통 평면의 반대편에서 등거리에있는 다른 점과 일대일 매핑이있는 객체 또는 그림을 대칭 대칭이라고합니다.

03. numpy flip

numpy의 문서를 보면 numpy flip은 다음과 같이 설명되어 있습니다.

 

flip 메소드는 배열의 원소들의 순서를 재배치 해주는 역할인것이고, 배열(array)을 입력으로 출력 또한 배열형태 이고, axis라는 옵션에 따라서 차원이 정해집니다.

예시.

>>> A = np.arange(10).reshape(2,5)
>>> print(A)
[[0 1 2 3 4]
 [5 6 7 8 9]]

>>>print(np.flip(A,0))
[[5 6 7 8 9]
 [0 1 2 3 4]]

>>>print(np.flip(A,1))
[[4 3 2 1 0]
 [9 8 7 6 5]]

위 와 같이 axis가 0, 1에 따라 위와 아래가 바뀌던지 원소들의 배열이 바뀐다던지 등의 차원 반전이 생깁니다. axis는 차원에 따라 최대 숫자가 늘어납니다.

 

04. numpy flip을 활용한 이미지 축 대칭 시키기

이를 통해서 이미지를 반전시키는 것이 가능한데요, 최근에 DICOM 이미지를 통해 변환한 경험으로, 오픈 DICOM 데이터인 "Digimouse"를 사용해보았습니다.

주로 사용하시는 DICOM형태는 아니고, nifty 파일 형식으로 되어 있는 이미지 파일이지만, DICOM 또한 pydicom으로 array를 출력하면 동일하게 적용됩니다. 

 

DICOM 오픈이미지; Digimouse

https://neuroimage.usc.edu/neuro/Digimouse_Download

 

Digimouse_Download - Biomedical Imaging Group"

Digimouse_Download (2012-02-12 07:26:42에 cpe-76-170-79-250가(이) 마지막으로 수정)

neuroimage.usc.edu

여기서 Atlas 데이터를 변형 해보았습니다.

4.1 R-L 대칭

좌: 원본

우: 변환본

4.2 A-P 대칭

좌: 원본

우: 변환본

4.3 I-S 대칭

좌: 원본

우: 변환본

위 와 같이 axis가 0, 1에 따라 위와 아래가 바뀌던지 원소들의 배열이 바뀐다던지 등의 차원 반전이 생깁니다. axis는 차원에 따라 최대 숫자가 늘어납니다.

5. 작성코드

import nibabel as nib
import numpy as np
# ctfn = '/home/hwan/code/study/04.DICOM/nibabel/ct_380x992x208.nii'
niifn = '/home/hwan/code/study/04.DICOM/nibabel/nii/atlas_380x992x208.nii'


proxy = nib.load(niifn)
data = proxy.get_fdata()
array = data.view(type=np.ndarray)
# np.flip(array,0) -> 좌우대칭 RL
# np.flip(array,1) -> 앞뒤대칭 AP 
# np.flip(array,2) -> 상하대칭 IS
array_flip = np.flip(array,2)
aff = proxy.affine
hdr = proxy.header

zflip = nib.Nifti1Image(array_flip,aff, hdr)
nib.save(zflip, './ISflip_atlas_380x992x208.nii')
728x90
반응형

'Programming > Python' 카테고리의 다른 글

파이썬 *arg 와 **kwargs 이해 하기  (0) 2022.03.11
파이썬 f-string  (0) 2021.12.31
파이썬 모듈이란? 패키지란?  (0) 2021.07.01
파이썬 PEP8 스타일 가이드 정리  (0) 2021.07.01
파이썬 클래스 상속  (0) 2021.06.28