본문 바로가기
인공지능/컴퓨터비전

[영상처리] OpenCV - 다양한 배열 처리 함수

by 책 읽는 개발자_테드 2020. 5. 10.
반응형

기본 배열(Array) 처리 함수

 

컬러 영상과 OpenCV

 

 컬러 영상은 파란색,녹색,빨간색의 각각의 독립적인 2차원 정보을 갖는다. 때문에 2차원 정보 3개를 갖는 컬러 영상을 표현하기 위해서는 3차원 배열을 사용해야한다.

 

 3차원 배열을 다루는 것은 어렵기 때문에 OpenCV에서 Mat 클래스를 지원한다. Mat 클래스에서는 채널 개념이 도입되어 있으며, 파란색,녹색,빨간색의 독립적인 2차원 채널로 존재한다(Blue 채널, Green 채널, Red 채널로 처리).

 

예시 - 다양한 함수

 

 

채널 처리 함수

 

 OpenCV에서 기본으로 제공하는 배열은 채널의 개념을 갖는다. 만약 3채널 행렬(컬러)의 원소 저장 방식이라면, 3채널 Mat - 컬러 영상 -> Pixel-wise 방식으로 순회한다.

 

 

merge()

 여러 채널을 하나로 합치는 함수다. 다시 말해서 여러 개의 단일채널 배열로 다중 채널의 배열을 합성한다.

함수 및 인자 설명
void merge() 여러 개의 단일채널 배열로 다중 채널의 배열을 합성한다.
Mat* mv


size_t count

outputArray dst
합성될 입력 배열 혹은 벡터, 합성될 단일 채널 배열의 크기/깊이가 동일해야 한다.

합성될 배열의 개수를 뜻하며, 0보다 커야 한다.

입력 배열과 크기/깊이가 같은 출력배열이다.

 

split()

 컬러 영상을 각 채널로 나누는 함수다.

함수 및 인자 설명
void split() 다중 채널 배열을 여러 개의 단일채널 배열로 분리한다.
Mat* src
•Mat* mvbegin
•inputArray m
•inputArrayOfArrays mv
입력되는 다중 채널 행렬
분리되어 반환되는 단일 채널 행렬울 원소로 하는 배열
입력되는 다중 채널 배열
분리되어 반환되는 단일 채널 배열들의 벡터 혹은 배열

 

예제 - 채널 분리 및 합성 

Mat ch0(3, 4, CV_8U, Scalar(10)); //3x4 영상, unsigned char로 8비트, 10의 값
Mat ch1(3, 4, CV_8U, Scalar(20)); //20의 값
Mat ch2(3, 4, CV_8U, Scalar(30)); //30의 값

Mat bgr_arr[] = {ch0, ch1, ch2}; //세 변수를 합친 것
Mat bgr; //bgr이라는 Mat 변수

/* 처리 결과 */
merge(bgr_arr, 3, bgr); //bgr array 3개를 합쳐 bgr이 나옴.
vector<Mat> bgr_vec;    //bgr 컬러 영상을 3개로 쪼갠 각각의 채널
split(bgr, bgr_vec);    //위에서 합쳐진 것을 쪼갬

처리 결과

 

예제 - 컬러 영상 파일에서 채널 분리하기

처리 결과(Blue)

처리 결과(Green)

처리 결과(Red)

 

산술 연산 함수

 Mat 클래스에서 산술 연산은 원소간(per-elemnet) 연산 수행 방식이다.

 

함수의 인수와 반환자료형 구조

add, subtract, multiply, divide

 

 

벡터, 행렬 뿐만아니라 입력 인수 src1, src2 중 하나는 스칼라값일 수 있다(이 경우 행렬의 모든 원에서 동일한 스칼라값을 각각 더한다).

 

 

 

출처

OpenCV로 배우는 영상 처리 및 응용

이정진 교수님 수업

반응형

댓글