목적: 병리학 데이터를 읽고 시각화
1. 라이브러리 설치 및 모듈 임포트
!apt-get install openslide-tools
!pip install openslide-python
import os
from pathlib import Path
from openslide import OpenSlide
from pprint import pprint
import matplotlib.pyplot as plt
- openslide-tools: 병리학 데이터(W.S.I)를 읽기 위한 C 기반 도구.
- openslide-python: OpenSlide 라이브러리의 Python 바인딩으로 이미지 데이터 처리 지원.
- os: 파일 크기 확인 및 경로 작업에 사용.
- Path: 파일 경로 탐색.
- OpenSlide: 병리학 데이터(W.S.I) 파일 처리.
- pprint: 메타데이터 출력 시 가독성을 높이기 위한 도구.
- matplotlib.pyplot: 이미지 시각화 라이브러리.
2. 데이터 경로 설정 및 OpenSlide 객체 생성
BASE_PATH = Path('/content/drive/MyDrive/FastCampus/pathology_img')
path_img_path = list(BASE_PATH.glob('*/*'))[0]
slide = OpenSlide(path_img_path)
- BASE_PATH 경로에서 모든 하위 디렉토리 탐색 후 첫 번째 파일을 OpenSlide 객체로 로드.
- path_img_path: 탐색된 첫 번째 파일 경로.
3. 슬라이드 정보 출력 함수 정의
def show_path_info(slide):
print("Patient's dimensions..:", slide.dimensions) # 원본 이미지 크기(가로 x 세로).
print("Patient's z level......:", slide.level_count) # 해상도 레벨 개수.
print("Patient's z dimension..:", slide.level_dimensions) # 각 해상도 레벨의 이미지 크기.
- 슬라이드의 주요 정보를 출력하는 함수 정의.
4. 파일 크기 및 슬라이드 정보 출력
print(f"file size: {round(os.path.getsize(path_img_path) / 1024 ** 2, 2)} MB") # 파일 크기를 MB 단위로 출력.
show_path_info(slide) # 슬라이드의 주요 정보 출력.
- os.path.getsize: 파일 크기를 바이트 단위로 반환.
- / 1024 ** 2: 파일 크기를 메가바이트(MB) 단위로 변환.
결과:
file size: 319.2 MB
Patient's dimentsions..: (69065, 68679)
Patient's z level......: 4
Patient's z dimentsion.: ((69065, 68679), (17266, 17169), (4316, 4292), (2158, 2146))
5. 메타데이터 출력
pprint(dict(slide.properties)) # 촬영 날짜, 장비 정보 등 메타데이터 출력.
- slide.properties: OpenSlide 객체에 저장된 메타데이터를 딕셔너리 형태로 반환.
6. 최고 해상도에서 슬라이드 일부 읽기 및 시각화
region = (30000, 30000) # 읽기 시작 좌표 (x, y).
level = 0 # 최고 해상도 레벨.
size = (255, 256) # 읽을 영역의 크기 (가로 x 세로).
region = slide.read_region(region, level, size)
plt.figure(figsize=(20, 20))
plt.imshow(region) # 이미지 시각화.
print(region.size) # 읽은 이미지 크기 출력.
- slide.read_region: WSI 데이터의 특정 영역을 읽는 메서드.
- level=0: 최고 해상도로 이미지 읽기.
7. 중간 해상도에서 슬라이드 일부 읽기 및 시각화
region = (13000, 13000) # 읽기 시작 좌표.
level = 2 # 중간 해상도.
size = (500, 500) # 읽을 영역의 크기.
region = slide.read_region(region, level, size)
plt.figure(figsize=(20, 20))
plt.imshow(region) # 이미지 시각화.
- level=2: 중간 해상도로 이미지 읽기.
- 읽은 영역이 고해상도보다 더 넓은 범위를 포함.
8. 최저 해상도에서 슬라이드 일부 읽기 및 시각화
region = (10000, 10000) # 읽기 시작 좌표.
level = 3 # 최저 해상도.
size = (2158, 2146) # 읽을 영역의 크기.
region = slide.read_region(region, level, size)
plt.figure(figsize=(20, 20))
plt.imshow(region) # 이미지 시각화.
- level=3: 최저 해상도로 이미지 읽기.
- 더 넓은 영역을 포함하지만 세부 정보가 감소.