< OpenCV 4로 배우는 컴퓨터 비전과 머신 러닝 > 교재 9, 10장 공부
- 9장 에지 검출과 응용
9.1 에지 검출
<미분과 그래디언트>
- 에지: 한쪽 방향으로 픽셀 값이 급격하게 바뀌는 부분,
어두운 영역에서 갑자기 밝아지거나 또는 반대로 밝은 영역에서 급격하게 어두워지는 부분
- 에지를 통해 객체의 윤곽을 알아낼 수 있음
- 미분을 통해 변화량이 갑자기 바뀌는 부분을 뽑아냄
- 에지의 방향: 그래디언트 벡터와 수직인 방향을 표시한 것
<마스크 기반 에지 검출>
- 소벨 필터(Sobel filter) 마스크:
여러 가지 방법의 미분 근사 마스크가 개발되었지만 그중 가장 널리 사용되고 있는 미분 마스크
- OpenCV는 소벨 마스크를 이용하여 영상을 미분하는 Sobel() 함수를 제공
- sobel_derivative() 함수 실행 결과

- sobel_edge() 함수 실행 결과

<캐니 에지 검출기>
- 에지 검출을 최적화 문제 관점으로 접근함으로써 소벨 에지 검출 방법의 단점을 해결
- 세 가지 항목을 좋은 에지 검출기의 조건으로 제시
1. 정확한 검출
2. 정확한 위치
3. 단일 에지
- 캐니 에지 검출기(canny edge detector):
이러한 조건을 만족하는 새로운 형태의 에지 검출 방법을 제시, 그래디언트의 크기와 방향을 모두 고려하여 좀 더 정확한 에지 위치를 찾을 수 있음
- 내부적으로 크게 네 개의 연산 과정을 거침
1. 가우시안 필터링
2. 그래디언트 계산
3. 비최대 억재
4. 이중 임계값을 이용한 히스테리시스 에지 트래킹
- canny_edge() 함수 실행 결과

9.2 직선 검출과 원 검출
- 영상에서 추출한 에지 정보를 이용하여 영상에서 직선 또는 원을 검출하는 방법에 대해 설명
<허프 변환 직선 검출>
- 허프 변환(hough transform) 기법:
2차원 xy 좌표에서 직선의 방정식을 파라미터(parameter) 공간으로 변환하여 직선을 찾는 알고리즘
- y = ax+b -->> b = -xa+y 로 직선의 방정식을 변경해 ab공간 상에서 직성 형태로 표현
- 축적 배열을 사용: 직선이 많이 교차하는 점을 찾기 위해 사용
- OpenCV에서는 HoughLines() 함수를 사용하여 허프 변환 직선 검출을 수행
- hough_lines() 함수 실행 결과

- hough_line_segments() 함수 실행 결과
캐니 에지 검출 영상 위에 확률적 허프 변환에 의해 구해진 직선 성분을 함께 표시한 영상

<허프 변환 원 검출>
- 허프 변환을 이용하여 원을 검출
- 원의 방정식은 (x-a)^2 + (y-b)^2 = r^2 로, 세 개의 파라미터를 가지므로 3차원 파라미터 공간에서 축적 배열을 정의하고 사용하면 너무 많은 시간이 필요.
- 일반적인 허프 변환 대신 허프 그래디언트 방법(Hough gradient method)을 사용하여 원을 검출
1단계: 영상에 존재하는 모든 원의 중심 좌표 찾기
2단계: 검출된 원의 중심으로부터 원에 적합한 반지름을 구함
- hough_circles() 함수 실행 결과

- 10장 컬러 영상 처리
10.1 컬러 영상 다루기
<컬러 영상의 픽셀 값 참조>
- 각 픽셀 값에 접근해 픽셀 값을 반전하는 color_inverse() 함수 실행 결과

<색 공간 변환>
- 컬러 영상 처리에서는 RGB 색 공간보다 보통 색상 구분이 용이한 HSV, HSL 색 공간을 사용하거나 또는 휘도 성분이 구분되어 있는 YCrCb, YUV 등 색 공간을 사용하는 것이 유리함
- cvtColor() 함수: 입력 영상 src의 색 공간을 변환하여 결과 영상 dst를 생성
- BGR2GRAY 색 공간 변환 코드:
BGR 컬러 영상을 그레이스케일 영상으로 변환할 때 사용
y = 0.299R + 0.587G + 0.114B
- BGR2HSV, HSV 색 모델:
색상(hue), 채도(saturation), 명도(value)로 색을 표현하는 방식
- BGR2YCrCb, YCrCb 색 공간:
Y 성분은 밝기 또는 휘도(luminance) 정보를 나타내고, Cr과 Cb 성분은 색상 또는 색차(chrominance) 정보
- cvtColor() 함수를 이용한 다양한 영상 변환 중 그레이 스케일 영상으로 변환하는 코드 실행 결과

<색상 채널 나누기>
- 컬러 영상을 다루다 보면 빨간색 성분만을 이용하거나 HSV 색 공간으로 변환한 후 H 성분만을 이용하는 경우가 종종 발생. 이러한 경우에는 3채널 Mat 객체를 1채널 Mat 객체 세 개로 분리해서 다루는 것이 효율적.
- OpenCV에서 다채널 행렬을 1채널 행렬 여러 개로 변환할 때에는 split() 함수를 사용
- color_split() 함수를 사용하여 BGR 컬러 영상으로부터 B, G, R 색 채널을 분리하여 화면에 출력하는 예제 코드 실행 결과


- 1채널 행렬 여러 개를 합쳐서 다채널 행렬 하나를 생성하려면 merge() 함수를 사용
10.2 컬러 영상 처리 기법
<컬러 히스토그램 평활화>
- 히스토그램 평활화:
영상의 히스토그램 정보를 이용하여 명암비를 증가시키는 기법
- 컬러 히스토그램 평활화 방법을 실제 영상에 적용한 예제 코드 실행 결과

원본 영상의 색감은 그대로 유지한 채 명암비가 높아진 것을 확인 가능
<색상 범위 지정에 의한 영역 분할>
- 컬러 영상을 다루는 응용에서 자주 요구되는 기법은 특정 색상 영역을 추출하는 작업
- HSV 색 공간에서 inRange() 함수를 이용하여 입력 영상에서 특정 색상 영역을 추출하는 예제 프로그램 소스 코드 실행 결과

색상 H, 채도 S, 명도 V를 조절하여 그 사이에 있는 픽셀 위치를 확인 할 수 있음
상단의 트랙바를 조절하여 특정 명도를 고려하지 않는 등을 설정하여 파란색 픽셀 영역만 보이게 하는 등 할 수 있음
<히스토그램 역투영>
- 위와 같은 방식은 보통 빨간색, 노란색, 녹색, 파란색처럼 원색에 가까운 색상을 찾기에는 효과적이지만 사람의 피부색처럼 미세한 변화가 있거나 색상 값을 수치적으로 지정하기 어려운 경우에는 적합하지 않음
- "히스토그램 역투영"으로 해결 가능:
기준 영상으로부터 찾고자 하는 객체의 컬러 히스토그램을 미리 구하고, 주어진 입력 영상에서 해당 히스토그램에 부합하는 영역을 찾아내는 방식
주어진 히스토그램 모델과 일치하는 픽셀을 찾아내는 기법
- OpenCV에서 히스토그램 역투영은 calcBackProject() 함수를 이용하여 수행 가능
- 밝은 회색 또는 흰색으로 표시된 영역은 입력 영상의 픽셀 값이 지정한 히스토그램에서 높은 빈도수로 표현됨을 의미

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