- 객체 단위 분석
- (흰색) 객체를 분할하여 특징을 분석
- 객체 위치 및 크기 정보, 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 |