안녕하세요
오늘은 영상처리 OPENCV를 공부한것을 정리해볼까 합니다.
예전에 올렸을때는 기본함수가 어떤것이 있는지에 대해서 정리해서 올렸는데요.
함수정리 위주로 가니 효율적이지 않다고 생각이 들어서 예제들을 구현해보면서 함수에 대해서 설명하도록 하겠습니다.
저번에 Mat함수를 가장 많이 사용한다고 했는데요 이러한 Mat함수를 통해서 회전과 크기와 출력 화면의 크기도 조절할수가 있습니다.
그중에서 가장 큰 특징은 Matlab에서와 같이 화면을 읽어 올수가 있습니다.
화면을 불러오기 위해서는 cv::MAT image = (경로,영상의 형태)로 출력을 하면되는데요
어떻게 해야될지 예제를 보여드리도록 하겠습니다.
그전에 영상을 출력하기 위해서는 클래스를 불러와야되는데요
1
2
3
4
5
6
7
8
9 |
#include <opencv2/core/core.hpp> //Mat 클래스를 포함한 기본 자료구조와 여러 함수가 공유하는 클래스
#include <opencv2/highgui/highgui.hpp> //윈도우 화면과 마우스 등을 제어하는 사용자 인터페이스 함수
#include <opencv2/imgproc/imgproc.hpp> //영상처리 함수
#include <opencv2/features2d/features2d.hpp> //특징검출, 기술자, 매칭함수
#include <opencv2/objdetect/objdetect.hpp> //얼굴과 사람을 포함한 다양한 물체 검출 함수
#include <opencv2/video/video.hpp> //연속 영상과 모션 추정함수
#include <opencv2/calib3d/calib3d.hpp> // 카메라 캘리브레이션과 3차원 복원 함수
#include <opencv2/ml/ml.hpp> //기계 학습
#include <opencv2/flann/flann.hpp> //군집화와 다차원 공간탐색 |
cs |
글씨가 너무 작게 나오네요;; 이렇게 여러 클래스들이 있습니다.
이러한 클래스중에서 기본영상처리와 영상을 띄우긴 위해서는 Core,highgui, imgproc 총 3개만 사용하면됩니다.
먼저 처음 영상을 띄어보는 예제를 보여드리겠습니다.
lena(레나) 이미지 출처 : https://bellard.org/bpg/lena.html 파일을 예제 처럼 설정할려면 프로젝트 파일안에 이미지를 넣으면 됩니다. 출력 이미지
cs
위의 예제처럼 영상을 띄우긴 위해서는 imread함수를 사용하여 영상을 띄우면 되는데요
띄우기 위해서는 naemdWindow를 사용하여야합니다. (이름을 지정하지 않고 imshow 함수안에 이름을 넣어도 됩니다.)
이때 영상을 계속회서 화면에 출력하기 위해서는 waitKey()를 사용합니다.
이 waitKey 괄호안에 필요한 키를 입력하여 영상을 끌수가 있습니다.
이번에 이러한 이미지를 가지고 이미지에 노이즈를 추가시켜보겠습니다.
|
|
이렇게 노이즈를 추가할수가 있습니다.
코딩을 해서 돌리다보면 이러한 오류내용이 뜰때가 있을껍니다.
이경우는 경로에 이미지가 없다는 의미임으로 경로가 바로 됬는지 파일명과 형식은 잘되어있는지 꼭 확인해주세요
영상을 불러왔으니 영상을 저장해보는 예제를 해보도록 하겠습니다.
|
|
영상이 이렇게 4개가 추가적으로 생긴것을 확인할수가 있습니다.
이제는 영상을 가지고 뒤집고 움직여 보겠습니다.
|
|
결과 영상이 많이 뜨네요 이렇게 많은 함수들이 있습니다.
그중에서 예제에서 보시면 숫자 0,1,-1를 넣어주는데요
이것은 0경우는 x축기준으로 위아래로 뒤집는다는 의미고 1은 y축기준으로 좌우, -1은 양축으로 뒤집는다는 의미입니다.
이번에 이러한 영상을 가지고 히스토그램 평활화에 대해서 해보겠는데요
히스토그램이란 무엇일까요?
히스토그램이란 영상에서 한 픽셀마다 가지는 명암값이라고 정의할수가 있습니다.
저의가 grayscale로 영상을 봤을때 어둡고 밝은 이미지를 보았을떄 히스토그램이 왼쪽이나 오른쪽으로 치우처져있는 것을 볼수가 있는데요
이러한 영상의 명암값을 개선하기위해서는 대표적으로 히스토그램 평활화 과정과 히스토그램 스트레칭이 있습니다.
첫번째로 히스토그램 스트래칭에 대해서 설명하겠는데요
이과정은 말 그대로 히스토그램의 분포를 잡아서 명암값의 분포를 늘리는것입니다.
즉 원본이미지의 히스토그램의 최소값을 0으로 움직이고 히스토그램의 최대값을 256의 값으로 움직여서 히스토그램이 골고루 나오도록하게하는것인데요
|
|
이러한 스트래칭 방법은 원리는 아주 간편해서 좋습니다.
하지만 아주 작은 값이 최대값이나 최소값에 위치하면 개선되는것을 볼수가 없는데요
이것을 해결하기 위해서 히스토그램 평활화과정이 있습니다.
평화화 과정은 4가지 과정을 거쳐서 나오게 되는데요
첫번째로 히스토그을 계산합니다.
두번째로 히스토그램 빈도값에서 누적 빈도수(누적합)을 계산합니다.
세번째로 누적 빈도수를 정규화합니다. (nomalization)
네번째로 결과 화소값 = 정규화 누적합 * 최대 화소값에 맞춰줍니다.
|
|
이 과정은 밝은 영역부분을 다시 재편성해서 골고루 펴는 방법인데요. 흔히 분포의 균등이라는 방법이라고 합니다.
이방법을 통해서 영상의 밝기가 골고루 분포하게 되어서 어두운부분은 밝아지고 너무 밝은 부분은 어두워지는 효과를 볼수가 있습니다.
이렇게 위의 식과 같이 엄청 길게 나오지만 ㅋㅋ
정작 함수 equalizeHist(image, dst2);사용하면 바로 히스토그램 평활화가 된답니다. ㅎ
오늘은 여기까지 정리하겠습니다.
도움이 되셨으면 좋겠네요
수고하셨습니다.
'영상처리 > opencv' 카테고리의 다른 글
opencv 기본함수들 정리 (0) | 2017.05.30 |
---|---|
opencv 설치 (0) | 2017.05.25 |