Day48 - 과제2(4). 22.11.04.금

류소리·2022년 11월 4일
0

과제2

목록 보기
4/7
  • 과제2 팀플 조원 샘이님에게 받은 함수이다. 오늘은 아래 함수에 대하여 자세히 공부하고,
  • Hwi's ML doc님의 matplotlib 완벽 정리 편을 공부해 보겠다.

👌과제2 팀플 함수

def plot_example(idx_list):
    # 한 장에 여러 이미지(6장)를(을) 담을 것이다
    # fig, axes = plt.subplots(1, 6) = 6개(1*6; 한줄에 6장)의 ax들을 가지는 하나의 figure 생성
    fig, axes = plt.subplots(1, 6, figsize=(24, 10))
    
    # 서브 플롯 간의 간격 맞추기
    # subplots_adjust(left, bottom, right, top, wspace, hspace)
    # (left, bottom, right, top=4면의 위치 조정)
    # (wspace, hspace=너비와 높이 비율조절)
    fig.subplots_adjust(hspace = .2, wspace=.2)
    
    # flatten = 다차원 배열을 1차원 배열로 평평하게
    axes = axes.flatten()
    
    # 6개씩
    for i in range(6):
        # train_data에 있는 image_id는 X-ray사진과 매칭되는 파일명
        # idx_list에 담겨져 있는 0번째 .... 6번째 를 돌면서 파일명을 가져온다
        image_id = train_data.loc[idx_list[i], 'image_id']
        
        # dicom형식 파일에 접근
        data_file = pydicom.dcmread(train_dir + image_id+'.dicom')
        
        # 시각화 하기 위해 (이미지 파일)배열로 변환
        img = data_file.pixel_array
        axes[i].imshow(img, cmap='gray')
        
        # 서브 플롯당 제목 설정
        axes[i].set_title(train_data.loc[idx_list[i], 'class_name'])
        
        # box 정보가 없는 Nofinding을 제외하고
        if train_data.loc[idx_list[i], 'class_name'] != 'No finding':
            
            bbox = [train_data.loc[idx_list[i], 'x_min'],
                    train_data.loc[idx_list[i], 'y_min'],
                    train_data.loc[idx_list[i], 'x_max'],
                    train_data.loc[idx_list[i], 'y_max']]
            
            # matplotlib.patches.Rectangle = 도형 시각화
            # ((x, y), width, height)
            p = matplotlib.patches.Rectangle((bbox[0], bbox[1]),
                                             bbox[2]-bbox[0],
                                             bbox[3]-bbox[1],
                                             # ec(=edgecolor; 테두리 색)
                                             # fc(=facecolor; 면 색)
                                             # lw(=linewidth; 선 굵기)
                                             ec='r', fc='None', lw=1)
            # add_patch = 도형 시각화
            axes[i].add_patch(p)

👌matplotlib 완벽 정리

  • 데이터 분야 공부를 시작할때 가장 먼저 만나는 세 가지 라이브러리를 꼽자면 numpy, pandas, matplotlib 입니다.

matplotlib는 아래와 같이 크게 두 가지 방법으로 사용할 수 있습니다.

  • stateless API (objected-based) : 내가 지정한 figure, 내가 지정한 ax에 그림을 그리는 방법, 이런 특징으로 객체지향적이라고 할 수 있습니다.
  • stateful API (state-based) : 현재의 figure, 현재의 ax에 그림을 그리는 방법
  • figure : 그래프를 그릴 공간(종이) / ax(axes) : 그 공간 중 지금 내가 그릴 부분
  • 더 편리한 사용을 위해 pyplot이라는 wrapper 모듈을 만들었고, 놀랍게도 이 모듈을 이용하는 방법이 stateful 방법입니다.
  • 따라서 저희가 matplotlib를 import 할 때, 그냥 import matplotlib가 아닌 import matplotlib.pyplot 을 했던 것입니다.
    (stateless 방법만 사용한다면 import matplotlib 만 하면 됩니다)
  • 단점은 stateful은 stateless 만큼 정교한 작업은 할 수 없습니다.

👍stateless API

figure 와 ax 객체를 생성하는 방법
#1. fig = plt.figure() : ax 없는 빈 figure 생성 (후에 ax를 추가해줘야함)
#2. fig, ax = plt.subplots() : 하나의 ax 만을 가지는 하나의 figure 생성
#3. fig, axes = plt.subplots(2,2) : 4개(2*2)이 ax들을 가지는 하나의 figure 생성

 # fig, axes = plt.subplots(1, 6) = 6개(1*6; 한줄에 6장)의 ax들을 가지는 하나의 figure 생성

내가 만든 함수

import os
import pydicom

    #  pydicom에서 dicom/dcm 파일을 읽어줄때는 dcmread를 사용한다
test_1 = '/content/drive/MyDrive/과제2/test'
text_h = os.listdir(test_1)

def test_order(num):
    num = int(num)

    dcm = []

    for i in text_h[:num] : 
        test_path = test_1+'/'+i
        dcm.append(pydicom.dcmread(test_path))

    return(dcm)   

test_order(3) 

profile
새싹 빅테이터 개발자

0개의 댓글