컴퓨터 비전(OpenCV) 스터디

230619-25 스터디

2023. 6. 22. 15:05

 

< 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