사전지식

  • 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의 소스코드입니다. 자세히보면 아래와 같은 구성입니다.

  1. level_count을 read only attribute로 가지고있고, 원본은 `self._dz_levels`
  2. `self._dz_levels`은 초기화시 생성됨. 그리고, 이는`self.z_dimension`의 개수로 저장됨
  3. ` self.z_dimension`의 갯수가 deepzoom level 수인데, 이 숫자는 level 0의 dimension(이미지해상도)을 절반씩 줄여나가서 x축이나 y축이 1보다 작을때까지 dimension을 늘림
  4. 그렇기에, 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

 

반응형

+ Recent posts