본문 바로가기
Computer vision

[Computer vision] 이진영상 라벨링하기 / 4연결성(4-neighbors), 8연결성(8-neighbors)

by @__100.s 2021. 10. 27.
반응형

라벨링(labeling) 이란?

  • 영상 내에 존재하는 객체 픽셀 집합에 고유 번호를 매기는 작업으로, 연결된 구성 요소 레이블링 이라고도 함

4 연결성 (4-neighbors)

  • 4 연결성 : 특정 픽셀의 상하좌우로 붙어있는 픽셀끼리 연결되어 있다고 정의

8 연결성 (8-neighbors)

  • 8 연결성 : 특정 픽셀의 상하좌우뿐만 아니라 대각선 방향으로 인접한 픽셀까지 연결되어 있다고 정의

이진 영상 불러오기

img = cv2.imread('sample.png')
plt.imshow(img)

4 연결성 (4-neighbors) 라벨링 구현

def bfs(origin,check,colors,i,j,r,c,current_label) :
    q = deque([])
    q.append([i,j])
    dir =((1,0),(-1,0),(0,1),(0,-1))
    color = list(np.random.choice(range(256), size=3))

    count = 0
    while q :
        info = q.popleft() 

        if check[info[0]][info[1]] != 1 :
            check[info[0]][info[1]] = 1
            origin[info[0]][info[1]] = current_label
            colors[info[0]][info[1]] = color
            count += 1

        for x,y in dir :
            dx = info[0] + x
            dy = info[1] + y
            if 0 <= dx < r and 0 <= dy < c :
                if check[dx][dy] == 0 and origin[dx][dy] == 1 :
                    q.append([dx,dy])

    return count

def four_connect(img):
    sample = np.zeros_like(img)
    sample[img > 127] = 1
    r = len(sample)
    c = len(sample[0])
    origin = sample
    check = np.zeros(sample.shape)
    colors = np.zeros((r,c,3))
    current_label = 0
    for i in range(r):
        for j in range(c) :
            if origin[i][j] == 1 and check[i][j] == 0 :
                current_label=current_label+1
                bfs(origin,check,colors,i,j,r,c,current_label)
    print(current_label)

    return  colors
img = cv2.imread('sample.png',0)
labeled_img = four_connect(img)

# image 출력
cv2_imshow(labeled_img)

8 연결성 라벨링 (8-neighbors) 구현

def bfs(origin,check,colors,i,j,r,c,current_label) :
    dir =((1, 0), (-1, 0), (0, 1), (0, -1), (1, 1), (1, -1), (-1, 1), (-1, -1))
    q = deque([])
    q.append([i,j])
    color = list(np.random.choice(range(256), size=3))

    count = 0

    while q :
        info = q.popleft()

        if check[info[0]][info[1]] != 1 :
            check[info[0]][info[1]] = 1
            origin[info[0]][info[1]] = current_label
            colors[info[0]][info[1]] = color
            count += 1

        for i in range(0,8):
            dx = info[0] + dir[i][0]
            dy = info[1] + dir[i][1]

            if 0 <= dx < r and 0 <= dy < c :
                if check[dx][dy] == 0 and origin[dx][dy] == 1 :
                    q.append([dx,dy])
    return count

def eight_connect(img):
    sample = np.zeros_like(img)
    sample[img > 127] = 1
    r = len(sample)
    c = len(sample[0])
    origin = sample
    check = np.zeros(sample.shape)
    colors = np.zeros((r,c,3))
    current_label = 0
    for i in range(r):
        for j in range(c) :
            if origin[i][j] == 1 and check[i][j] == 0 :
                current_label = current_label + 1
                bfs(origin,check,colors,i,j,r,c,current_label)

    print(current_label)
    return  colors
img = cv2.imread('sample.png',0)
labeled_img = eight_connect(img)

# image 출력
cv2_imshow(labeled_img)

참고

반응형