ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • RLE (RUN LENGTH ENCODING)
    컴퓨터 비젼(Computer Vision) 2022. 5. 11. 00:12

    매우 간단한 비손실 압축 방법으로, 데이터에서 같은 값이 연속해서 나타나는 것을 그 개수와 반복되는 값만으로 표현하는 방법이다.

    (FROM WIKIPEDIA)

     

    RLE로 된 데이터 (예를 들어 마스크 데이터) 는 특정한 형태로 이뤄졌다고 하자. (H: 높이, W: 너비)

    그러면 이 마스크 데이터의 형태는 H*W 길이의 평면화된 방식으로 표현될 것이다. 이렇게 표현된 값은 각 짝마다 정보를 포함하고 있다.

    첫번째 값은 평면화된 곳에서의 시작 위치, 두번째 값은 시작 위치에서부터의 길이를 표현한다.

    즉, RLE 마스크 데이터에서 홀수번째 값은 시작 위치, 짝수번째 값은 길이를 표현함을 알 수있다.

     

    RLE로 된 마스크 데이터가 다음과 같이 주어졌다고 하자. (Kaggle의 UWMGIT 데이터)

    28094 3 28358 7 28623 9 28889 9 29155 9 29421 9 29687 9 29953 9 30219 9 30484 10 30750 10 31016 10 3...

     

    코드 1)

    def prepare_mask_data(string):
        # fetching all the values from the string
        all_values = map(int, string.split(" "))
        # preparing the usable arrays
        starterIndex, pixelCount = [], []
        for index, value in enumerate(all_values):
            if index % 2:
                # storing even indexed values in pixelCount
                pixelCount.append(value)
            else:
                # storing odd indexed values in starterIndex
                starterIndex.append(value)
        return starterIndex, pixelCount
        
    def fetch_pos_pixel_indexes(indexes, counts):
        final_arr = []
        for index, counts in zip(indexes, counts):
            # adding all the values from starterIndex to range of positive pixel counts
            final_arr += [index + i for i in range(counts)]
        return final_arr
    
    def prepare_mask(string, height, width):
        # preparing the respective arrays
        indexes, counts = prepare_mask_data(string)
        # preparing all the pixel indexes those have mask values
        pos_pixel_indexes = fetch_pos_pixel_indexes(indexes, counts)
        # forming the flattened array
        mask_array = np.zeros(height * width)
        # updating values in the array
        mask_array[pos_pixel_indexes] = 1
        # reshaping the masks
        return mask_array.reshape(height, width)
     
    코드 2)
    # ref: https://www.kaggle.com/paulorzp/run-length-encode-and-decode
    def rle_decode(mask_rle, shape):
        '''
        mask_rle: run-length as string formated (start length)
        shape: (height,width) of array to return 
        Returns numpy array, 1 - mask, 0 - background
    
        '''
        s = mask_rle.split()
        starts, lengths = [np.asarray(x, dtype=int) for x in (s[0:][::2], s[1:][::2])]
        starts -= 1
        ends = starts + lengths
        img = np.zeros(shape[0]*shape[1], dtype=np.uint8)
        for lo, hi in zip(starts, ends):
            img[lo:hi] = 1
        return img.reshape(shape)  # Needed to align to RLE direction
    
    
    # ref.: https://www.kaggle.com/stainsby/fast-tested-rle
    def rle_encode(img):
        '''
        img: numpy array, 1 - mask, 0 - background
        Returns run length as string formated
        '''
        pixels = img.flatten()
        pixels = np.concatenate([[0], pixels, [0]])
        runs = np.where(pixels[1:] != pixels[:-1])[0] + 1
        runs[1::2] -= runs[::2]
        return ' '.join(str(x) for x in runs)

    참고

    https://en.wikipedia.org/wiki/Run-length_encoding

    https://www.kaggle.com/code/sagnik1511/uwmgit-data-preparation-from-scratch

     

     

     

     

    '컴퓨터 비젼(Computer Vision)' 카테고리의 다른 글

    [OCR] CRAFT 학습 간 주의사항  (0) 2022.11.27
    이진 영상 처리 - 외곽선 검출  (0) 2022.02.14
    이진 영상 처리 - 영상의 이진화  (0) 2022.02.14
    영상의 미분  (0) 2022.02.08
    잡음 제거  (0) 2022.02.06

    댓글

Designed by Tistory.