반응형

 

import cv2 as cv
import numpy as np

def DistanceTransform(img):
    assert type(img) is np.ndarray, 'Image was not a ndarray!'
    n_img = img.copy()
    _, n_img = cv.threshold(n_img,127,1,cv.THRESH_BINARY)
    
    # forward
    for i in range(1,n_img.shape[0]-1):
        for j in range(1,n_img.shape[1]-1):
            if n_img.item(i,j) == 1:
                if n_img.item(i-1,j) == 0 and n_img.item(i,j-1) == 0:
                    n_img.itemset(i,j,1)
                else:
                    value = np.min([n_img.item(i-1,j),n_img.item(i,j-1)]) + 1
                    n_img.itemset(i,j,value)

    #backward
    for i in range(1,n_img.shape[0]-1)[::-1]:
        for j in range(1,n_img.shape[1]-1)[::-1]:
            if n_img.item(i,j) >= 1:
                if n_img.item(i+1,j) == 0 and n_img.item(i,j+1) == 0:
                    n_img.itemset(i,j,1)
                else:
                    value = np.min([n_img.item(i+1,j),n_img.item(i,j+1)]) + 1
                    value = np.min([value,n_img.item(i,j)])
                    n_img.itemset(i,j,value)
    return n_img

if __name__ == "__main__":
    img = cv.imread('test.jpg')
    img = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
    new_img = DistanceTransform(img)
    new_img *= 5 # 픽셀값이 1씩 차이나면 잘 안보이므로 5를 곱해줌
    cv.imshow('roi',img)
    cv.imshow('res',new_img)
    cv.waitKey(0)
    cv.destroyAllWindows()

Distance Transform을 구현한 프로그램이다.

Distance Transform은 Binary Image에서 픽셀이 배경에서 멀어질수록,

픽셀이 점점 더 큰 값을 지니게 바꾸는 것이다.

4-연결성과 8-연결성으로 방법이 나뉘는데, 여기서는 4-연결성을 구현하였다.

Distance Transform 변환 모습

실행 결과는 다음과 같다.

Distance Transform 실행결과 [좌: 원본 이미지, 우: 결과 이미지]

 

반응형

'영상처리' 카테고리의 다른 글

Canny Edge Detection (Python) 수정  (0) 2022.06.23
K-MEANS Algorithm On Color Image  (0) 2021.04.09
Canny Edge Detection (Python)  (0) 2020.04.20
Image Rotation(Python)  (0) 2020.03.23

+ Recent posts