반응형
라벨링(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)
참고
반응형
'Computer vision' 카테고리의 다른 글
[Computer vision] 이진화 영상 팽창(dilation), 침식(erosion), 열기(open), 닫기(close) (0) | 2021.12.03 |
---|---|
[Computer vision] 이진화 알고리즘 / 오츄 알고리즘 (0) | 2021.10.29 |
[Computer vision] 라플라시안 연산자 (Laplacian Operator) (0) | 2021.09.30 |
[Computer vision] 선형 필터(Linear Filter) / 박스 필터(Box Filter), 가우시안 필터(Gaussian Filter) (0) | 2021.09.23 |
[Computer vision] 컨볼루션 Convolution이란? (0) | 2021.09.23 |