본문 바로가기

# 미사용/OpenCV

[OpenCV] 행렬의 대칭, 전치, 반복


 샘플 이미지 (영상)

Banner vector created by freepik - www.freepik.com




 기본 영상처리 함수 (1)

N 채널 영상에 대해 기본적인 연산을 제공한다.

  • 대칭

  • 전치

  • 반복



 대칭

def )

/**
 * src를 axis방향으로 대칭시켜 dest에 붙여넣는다.
 *
 * @param src   대칭시킬 행렬.
 * @param dest  결과가 저장될 행렬.
 * @param axis  축을 정의하는 상수.
 *      0  : x축 대칭
 *      1  : y축 대칭
 *      -1 : xy축 대칭
 */
void fiip(InputArray src, OutputArray dest, int axis);



example 1)

1채널 영상을 대칭.

//! 테스트 행렬.
Mat mat = Mat(Size(5, 5), CV_32SC1);
for(int y=0; y<mat.rows; y++){
    for(int x=0; x<mat.cols; x++){
        mat.at<int>(y, x) = y*mat.cols + x;
    }
}
/*
 * [ 0,  1,  2,  3,  4;
 *   5,  6,  7,  8,  9;
 *  10, 11, 12, 13, 14;
 *  15, 16, 17, 18, 19;
 *  20, 21, 22, 23, 24]
 */


//! xy축에 대해 대칭.
flip(mat, mat, -1);
/*
 * [24, 23, 22, 21, 20;
 *  19, 18, 17, 16, 15;
 *  14, 13, 12, 11, 10;
 *   9,  8,  7,  6,  5;
 *   4,  3,  2,  1,  0]
 */



example 2)

3채널 영상을 대칭.

Mat image = imread("./images/image.jpg", IMREAD_UNCHANGED);
flip(image, image, 1);
imshow("canvas", image);
waitKey();





 전치

전치란 (a, b)의 위치를 (b, a)로 옮기는 것을 말한다.


2번 전치하면 원래 영상으로 돌아온다.

전치는 회전이 아님에 주의하자.


def )

/**
 * src의 전치행렬을 dest로 복사한다.
 * 
 * @param src   전치할 행렬
 * @param dest  결과가 저장될 행렬
 */
void transpose(InputArray src, OutputArray dest);


example 1)

1채널 영상을 전치

//! 테스트 행렬.
Mat mat = Mat(Size(5, 3), CV_32SC1);
for(int y=0; y<mat.rows; y++) {
    for (int x = 0; x < mat.cols; x++) {
        mat.at<int>(y, x) = y * mat.cols + x;
    }
}
/*
 * [ 0,  1,  2,  3,  4;
 *   5,  6,  7,  8,  9;
 *  10, 11, 12, 13, 14]
 */

//! 전치
transpose(mat, mat);
/*
 * [0, 5, 10;
 *  1, 6, 11;
 *  2, 7, 12;
 *  3, 8, 13;
 *  4, 9, 14]
 */



 반복

def )

/**
 * src를 반복 복사한다.
 * 
 * @param src   반복할 행렬. 
 * @param ny    y방향 반복 횟수.
 * @param nx    x방향 반복 횟수.
 * @return      반복 복사된 행렬.
 */
Mat repeat(InputArray src, int ny, int nx);


example 1)

1채널 영상을 반복.

//! 테스트 행렬.
Mat mat = Mat(Size(3, 1), CV_32SC1);
for(int y=0; y<mat.rows; y++) {
    for (int x = 0; x < mat.cols; x++) {
        mat.at<int>(y, x) = y * mat.cols + x;
    }
}
/*
 * [0, 1, 2]
 */

//! 반복 복사.
Mat repeated = repeat(mat, 3, 2);
/*
 * [0, 1, 2, 0, 1, 2;
 *  0, 1, 2, 0, 1, 2;
 *  0, 1, 2, 0, 1, 2]
 */


example 2)

3채널 영상을 반복

//! 이미지 로드.
Mat image = imread("./images/image.jpg", IMREAD_UNCHANGED);
Mat repeated = repeat(image, 2, 1);
imshow("canvas", repeated);
waitKey();



'# 미사용 > OpenCV' 카테고리의 다른 글

[OpenCV] 행렬의 산술연산  (0) 2019.10.31
[OpenCV] 채널의 분리, 병합, 혼합  (0) 2019.10.31
[OpenCV] 기본도형 그리기  (0) 2019.10.29
[OpenCV] 윈도우 및 이벤트 관리  (0) 2019.10.29
[OpenCV] 이미지 입출력  (0) 2019.10.29