Computer Vision/opencv(python)

[44] 6) 레이블링

jwjwvison 2021. 3. 23. 15:42
  • 객체 단위 분석
    • (흰색) 객체를 분할하여 특징을 분석
    • 객체 위치 및 크기 정보, ROI추출, 모양 분석 등

 

  • 레이블링(Connected Component Labeling)
    • 서로 연결되어 있는 객체 픽셀에 고유한 번호를 지정(레이블맵)
    • 영역 기반 모양 분석
    • 레이블맵, 바운딩 박스 ,픽셀 개수, 무게 중심 좌표를 반환

 

  • 외곽선 검출(Contour Tracing)
    • 각 객체의 외곽선 좌표를 모두 검출
    • 외곽선 기반 모양 분석
    • 다양한 외곽선 처리 함수에서 활용 가능(근사화, 컨벡스힐 등)

 

  • 레이블링 이란?
    • 동일 객체에 속한 모든 픽셀에 고유한 번호를 매기는 작업
    • 일반적으로 이진 영상에서 수행
    • Connected component labeling
  • 픽셀의 연결 관계
    • 4-이웃 연결 관계
    • 8-이웃 연결 관계

 

  • 레이블링 알고리즘의 입력과 출력

 

  • 레이블링 함수
cv2.connectedComponents(image,label=None,connectivity=None,Itype=None) -> retval,labels

 • image: 8 비트 1 채널 영상
 • labels: 레이블 맵 행렬 . 입력 영상과 같은 크기 . numpy.ndarray
 • connectivity: 4 또는 8. 기본값은 8.
 • ltype : labels 타입 . cv2.CV_32S 또는 cv2.CV_16S. 기본값은 cv2.CV_32S.
 • retval: 객체 개수 . N 을 반환하면 [0, N-1] 의 레이블이 존재 하며 , 0 은 배경을 의미 . (실제 흰색 객체 개수는 N-1개)

 

  • 객체 정보를 함께 반환하는 레이블링 함수
cv2.connectedComponentsWithStats(image,labels=None,stats=None,
                       centroids=None,connectivity=None,Itype=None) -> retval,labels,stats,centroids

 • image: 8 비트 1 채널 영상
 • labels: 레이블 맵 행렬 . 입력 영상과 같은 크기 . numpy.ndarray
 • stats: 각 객체의 바운딩 박스 , 픽셀 개수 정보를 담은 행렬 numpy.ndarray . shape=shape=(N, 5), dtype numpy.int32
 • centroids: 각 객체의 무게 중심 위치 정보를 담은 행렬. numpy.ndarray . shape=shape=(N, 2), dtype numpy.float64
 • ltype : labels 행렬 타입 . cv2.CV_32S 또는 cv2.CV_16S. 기본값은 cv2.CV_32S.

 

  • 키보드 영상에서 문자 영역 분할 예제
import sys
import numpy as np
import cv2

src=cv2.imread('keyboard.bmp',cv2.IMREAD_GRAYSCALE)

if src is None:
    print('Image load failed!')
    sys.exit()

#이진화된 영상
_,src_bin=cv2.threshold(src,0,255,cv2.THRESH_BINARY |cv2.THRESH_OTSU)  #otsu 만 써도 잘 동작함
# src_bin2=cv2.morphologyEx(src_bin,cv2.MORPH_OPEN,None) opening 방법으로 노이즈 제거

cnt,labels,stats,centroids=cv2.connectedComponentsWithStats(src_bin)

dst=cv2.cvtColor(src,cv2.COLOR_GRAY2BGR)
#객체 위치에 빨간색 사각형 형성
for i in range(1,cnt):   #배경은 필요 없으므로 1부터 시작
    x,y,w,h,a=stats[i]

    if a<20:            #면적이 작은 객체들은 사각형 형성하지 않는다 오프닝 방법보다 시간이 덜 걸릴듯
        continue

    cv2.rectangle(dst,(x,y,w,h),(0,0,255),2)

cv2.imshow('src',src)
cv2.imshow('src_bin',src_bin)
cv2.imshow('dst',dst)
cv2.waitKey()
cv2.destroyAllWindows()

'Computer Vision > opencv(python)' 카테고리의 다른 글

[46] 8) 다양한 외곽선 함수  (0) 2021.03.24
[45] 7) 외곽선 검출  (0) 2021.03.23
[43] 모폴로지(2): 열기와 닫기  (0) 2021.03.23
[42] 4) 모폴로지 (1): 침식과 팽창  (0) 2021.03.23
[41] 3) 지역 이진화  (0) 2021.03.23