사전지식
- Openslide-python은 파이썬 바인딩된 openslide의 패키지입니다. 여기서는 일반적인 WSI(whole slide Image)의 이미지 피라미드 구조로 다운 샘플링하여 처리함
- Deepzoom은 Deepzoom은 OpenSlide와 함께 사용되는 강력한 도구로, 대형 이미지를 다양한 줌 레벨에서 효율적으로 탐색할 수 있게 해줍니다. 이는 특히 WSI와 같은 고해상도 이미지에 유용
요약
- Openslide의 level 0가 가장 초해상도 이미지 (mpp)
- Deepzoom의 level max가 가장 초고해상도 이미지 (mpp).
Deepzoom level과 openslide level의 매핑
Deepzoom level_count와 openslide.Openslide.level_count의 숫자가 일치하지 않을 수 있습니다. Deepzoom에서의 level의 정의가 다르기 때문입니다.
- Openslide level: level 0가 가장 초고해상도로 level max까지 해상도가 작아집니다. level 0에 mpp의 기준이됩니다.
- Deepzoom level: level max가 초고해상도로, level min이 작아질수록 해상도가 작아집니다. level min값이 될때까지 이미지를 절반으로 줄여나갑니다.
아래는 openslide-python의 DeepZoomGenerator의 소스코드입니다. 자세히보면 아래와 같은 구성입니다.
- level_count을 read only attribute로 가지고있고, 원본은 `self._dz_levels`
- `self._dz_levels`은 초기화시 생성됨. 그리고, 이는`self.z_dimension`의 개수로 저장됨
- ` self.z_dimension`의 갯수가 deepzoom level 수인데, 이 숫자는 level 0의 dimension(이미지해상도)을 절반씩 줄여나가서 x축이나 y축이 1보다 작을때까지 dimension을 늘림
- 그렇기에, deepzoom level의 1(0인덱스)~5(4인덱스)사이에서는 주로 (1, 1), (1, 2), (2,1)과 같은 사이즈를 관찰할 수 있습니다. openslide level에서는 이를 정의하지 않죠. 여기서 level count의 갯수차이가 납니다.
class DeepZoomGenerator:
"""Generates Deep Zoom tiles and metadata."""
BOUNDS_OFFSET_PROPS = (
openslide.PROPERTY_NAME_BOUNDS_X,
openslide.PROPERTY_NAME_BOUNDS_Y,
)
BOUNDS_SIZE_PROPS = (
openslide.PROPERTY_NAME_BOUNDS_WIDTH,
openslide.PROPERTY_NAME_BOUNDS_HEIGHT,
)
...
z_size = self._l0_dimensions
z_dimensions = [z_size]
while z_size[0] > 1 or z_size[1] > 1:
z_size = tuple(max(1, int(math.ceil(z / 2))) for z in z_size)
z_dimensions.append(z_size)
self._z_dimensions = tuple(reversed(z_dimensions))
....
# Deep Zoom level count
self._dz_levels = len(self._z_dimensions)
@property
def level_count(self):
"""The number of Deep Zoom levels in the image."""
return self._dz_levels
반응형