반응형
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-연결성을 구현하였다.
실행 결과는 다음과 같다.
반응형
'영상처리' 카테고리의 다른 글
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 |