< OpenCV 4로 배우는 컴퓨터 비전과 머신 러닝 > 교재 11, 12장 공부
- 11장 이진화와 모폴로지
11.1 영상의 이진화
- 영상의 이진화는 영상에서 관심 있는 객체 영역과 배경 영역을 구분하기 위한 용도로 널리 사용
<이진화>
- 영상의 이진화(binarization):
영상의 각 픽셀을 두 개의 부류로 나누는 작업
- OpenCV에서 이진화는 threshold() 함수를 이용하여 수행 가능
- 다양한 임계값을 이용하여 이진화를 수행하는 코드 실행 결과

<적응형 이진화>
- 전역 이진화(global binarization):
영상의 모든 픽셀에 같은 임계값을 적용하여 이진화를 수행하는 방식
- 균일하지 않은 조명 환경에서 촬영된 영상에 대해 전역 이진화를 수행하면 객체와 배경이 적절하게 분리되지 않는 경우가 발생
- 적응형 이진화(adaptive binarization) 기법:
불균일한 조명 성분을 가지고 있는 영상에 대해서는 하나의 임계값으로 객체와 배경을 제대로 구분하기 어렵기 때문에 각 픽셀마다 서로 다른 임계값을 사용
- OpenCV에서 적응형 이진화는 adaptiveThreshold() 함수를 이용하여 수행 가능
- 적응형 이진화 코드 실행 결과
전체적으로 스도쿠 글씨와 사각형 외곽선이 검은색으로 이진화되어 구분이 잘 되는 것을 확인할 수 있음


11.2 모폴로지 연산
<이진 영상의 침식과 팽창>
- 모폴로지(morphology):
형태 또는 모양에 관한 학문을 의미
영상 처리 분야에서 모폴로지는 영상에서 객체의 형태 및 구조에 대해 분석하고 처리하는 기법
- 모폴로지 기법
그레이스케일 영상과 이진 영상에 대하여 모두 적용할 수 있지만, 주로 이진 영상에서 객체의 모양을 단순화시키거나 잡음을 제거하는 등 용도로 사용
- 영상의 모폴로지 기법 중에서 가장 기본이 되는 연산은 침식(erosion)과 팽창(dilation)
- 침식 연산:
구조 요소를 영상 전체에 대해 스캔하면서, 구조 요소가 객체 영역 내부에 완전히 포함될 경우 고정점 위치 픽셀을 255로 설정
- 팽창 연산:
구조 요소를 영상 전체에 대해 이동시키면서, 구조 요소와 객체 영역이 한 픽셀이라도 만날 경우 고정점 위치 픽셀을 255로 설정
- OpenCV에서 구조 요소는 원소 값이 0 또는 1로 구성된 CV_8UC1 타입의 Mat 행렬로 표현, getStructuringElement() 함수를 제공
- OpenCV에서 영상의 침식 연산은 erode() 함수를 이용하여 수행
- OpenCV에서 팽창 연산을 수행하려면 dilate() 함수를 사용
- erode_dilate() 함수 코드 실행 결과

<이진 영상의 열기와 닫기>
- 열기 연산
입력 영상에 대하여 침식 연산을 수행한 후, 다시 팽창 연산을 수행하는 연산
- 닫기 연산
팽창 연산을 먼저 수행한 후, 다시 침식 연산을 수행하는 연산
- OpenCV에서 모폴로지 열기와 닫기 연산은 morphologyEx() 함수를 이용하여 수행
- morphologyEx() 함수를 이용하여 이진 영상에 모폴로지 열기와 닫기 연산을 수행하는 예제 코드 실행 결과

- 12장 레이블링과 외곽선 검출
12.1 레이블링
- 레이블링 기법은 영상 내부에 있는 각 객체의 위치, 크기, 모양 등 특징을 분석할 때 사용
<레이블링의 이해>
- 레이블링(labeling)(==구성 요소 레이블링):
영상 내에 존재하는 객체 픽셀 집합에 고유 번호를 매기는 작업
각 객체의 위치와 크기 등 정보를 추출하는 작업은 객체 인식을 위한 전처리 과정으로 자주 사용
- 4-방향 연결성(4-way connectivity):
특정 픽셀의 상하좌우로 붙어 있는 픽셀끼리 연결되어 있다고 정의
- 8-방향 연결성:
상하좌우로 연결된 픽셀뿐만 아니라 대각선 방향으로 인접한 픽셀도 연결되어 있다고 간주
- 입력 영상의 각 객체 픽셀 영역에는 고유의 번호가 매겨짐
- OpenCV 라이브러리는 3.0.0 버전부터 레이블링 함수를 제공, connectedComponents()
- 작은 크기의 입력 영상과 레이블 맵 행렬을 모두 콘솔 창에 출력하는 코드 실행 결과

<레이블링 응용>
- 기본적인 레이블링 동작은 입력 영상으로부터 레이블 맵을 생성하는 것
- OpenCV는 레이블 맵과 각 객체 영역의 통계 정보를 한꺼번에 반환하는 connectedComponentsWithStats() 함수를 제공

12.2 외곽선 검출
- 레이블링과 더불어 이진 영상에서 객체의 위치 및 크기 정보를 추출하는 유용한 방법 중에 외곽선 검출
<외곽선 검출>
- 객체의 외곽선(contour):
객체 영역 픽셀 중에서 배경 영역과 인접한 일련의 픽셀을 의미
- 검출된 외곽선 점들의 좌표는 앞에서 선언한 contours 변수에 모두 저장됨
- OpenCV에서 영상 내부 객체들의 외곽선을 검출하는 함수 이름은 findContours()
- findContours() 함수로 검출한 외곽선 정보를 이용하여 영상 위에 외곽선을 그리고 싶다면 drawContours() 함수를 사용 가능
객체 바깥쪽 외곽선과 안쪽 홀 외곽선이 모두 임의의 색상으로 그려진 것을 확인할 수 있음

- 외곽선 계층 구조를 사용하여 외곽선을 검출하고 그리는 예제 코드 실행 결과
외곽선 계층 정보 hierarchy 변수를 전달하였기 때문에 객체 바깥쪽 외곽선부터 안쪽 홀 외곽선까지 객체 영역만 지정된 색상으로 채워진 것을 확인할 수 있음

<외곽선 처리 함수>
- boundingRect() 함수
주어진 외곽선 점들을 감싸는 가장 작은 크기의 사각형, 즉 바운딩 박스 구하기
- minAreaRect() 함수
특정 외곽선을 감싸는 가장 작은 면적의 사각형 정보를 반환하는 함수
- minEnclosingCircle() 함수
외곽선 또는 점들을 감싸는 최소 크기의 원 구하기
- RotatedRect::angle 멤버 변수를 참조하여 객체의 대략적인 회전 각도를 가늠 가능
- arcLength() 함수
임의의 곡선을 형성하는 점들의 집합을 가지고 있을 때, 해당 곡선의 길이 구하기
- contourArea() 함수
의의 외곽선 정보를 가지고 있을 때, 외곽선이 감싸는 영역의 면적 구하기
- approxPolyDP() 함수
외곽선 또는 곡선을 근사화 가능
- 입력 영상을 이진화하여 객체 영역을 모두 검출하고, 검출한 객체의 외곽선 정보를 이용하여 삼각형, 사각형, 원을 판단하여 화면에 표시하는 코드 실행 결과

'컴퓨터 비전(OpenCV) 스터디' 카테고리의 다른 글
| 230626-230702 스터디 (0) | 2023.06.29 |
|---|---|
| 230626-230702 스터디 (0) | 2023.06.28 |
| 230619-25 스터디 (0) | 2023.06.22 |
| 230612-18 스터디 (0) | 2023.06.18 |
| 230522-28 스터디 (0) | 2023.05.27 |