본문 바로가기

# 미사용/OpenCV

[OpenCV] 행렬의 산술연산


 행렬의 산술연산 종류

마스킹 산술연산

    • 마스킹 덧셈

    • 마스킹 뺄셈

마스크가 1인 위치만 산술연산을 수행한다.

마스크가 0인 위치는 0으로 설정된다.




스케일 산술연산

    • 스케일 덧셈

    • 스케일 곱셈

    • 스케일 나눗셈 

첫번째 피연산자를 scale만큼 곱하고 산술연산을 수행한다.




가중치 산술연산

    • 가중치 덧셈

각 피연산자에 각각 alpha, beta만큼 곱하 산술연산을 수행한다.

그 뒤에 gamma도 더한다.




 마스킹 산술연산

def )

/**
 * 마스크를 씌우고 산술연산을 수행한다.
 * 
 * @param src1  첫번째 피연산자
 * @param src2  두번째 피연산자
 * @param dest  결과가 저장될 곳
 * @param mask  마스크 행렬
 */
void add(Mat src1, Mat src2, Mat dest, Mat mask);
void subtract(Mat src1, Mat src2, Mat dest, Mat mask);



마스크가 없어도 되지만,

그런 경우에는 사칙연산자가 더 직관적이다.

Mat ans, x, y;

add(x, y, ans);
ans = x + y;



example)

마스크가 1인 지점만 연산에 참여한다.

//! 샘플 행렬
Mat x, y, mask;
/*
 * x            y           mask
 *  [3, 3, 3;    [2, 2, 2;   [0, 0, 0;
 *   3, 3, 3;     2, 2, 2;    0, 1, 0;
 *   3, 3, 3]     2, 2, 2]    0, 0, 0]
 */


//! 마스킹을 포함한 덧셈, 뺄셈
Mat mask_add, mask_sub;
add(x, y, mask_add, mask);
subtract(x, y, mask_sub, mask);
/*
 * mask_add     mask_sub
 *  [0, 0, 0;    [0, 0, 0;
 *   0, 5, 0;     0, 1, 0;
 *   0, 0, 0]     0, 0, 0]
 */




 스케일 산술연산

def)

/**
 * 스케일이 주어진 산술연산을 수행한다.
 *
 * @param src1  첫번째 피연산자
 * @param src2  두번째 피연산자
 * @param dest  결과가 저장될 곳
 * @param scale 첫번째 피연산자에 곱할 값
 */
void multiply(Mat src1, Mat scr2, Mat dest, double scale);
void divide(Mat src1, Mat src2, Mat dest, double scale);
void scaleAdd(Mat src1, double scale, Mat src2, Mat dest);



example)

스케일은 피연산자에 곱해진다.

//! 샘플 행렬
Mat x, y;
/*
 * x            y
 *  [3, 3, 3;    [2, 2, 2;
 *   3, 3, 3;     2, 2, 2;
 *   3, 3, 3]     2, 2, 2]
 */


//! 스케일이 포함된 덧셈, 곱셈, 나눗셈.
Mat scale_add, scale_mul, scale_div;
scaleAdd(x, 2, y, scale_add);
multiply(x, y, scale_mul, 1.5);
divide(x, y, scale_div, 2.0);
/*
 * scale_add    scale_mul     scale_div
 *  (3*2)+2     (3*1.5)*2     (3*2.0)/2
 *  [8, 8, 8;    [9, 9, 9;     [3, 3, 3;
 *   8, 8, 8;     9, 9, 9;      3, 3, 3;
 *   8, 8, 8]     9, 9, 9]      3, 3, 3]
 */




 가중치 산술연산

가중치의 각 요소는 다음과 같이 이루어져있다.

  • 첫번째 피연산자에 곱해질 값.  (alpha)

  • 두번째 피연산자에 곱해질 값.  (beta)

  • 연산후 더해질 값.  (gamma) 


def )

/**
 * 가중치 덧셈을 수행한다.
 * 
 * @param src1  첫번째 피연산자
 * @param alpha 첫번째 피연산자에 곱해질 값
 * @param src2  두번째 피연산자
 * @param beta  두번째 피연산자에 곱해질 값
 * @param gamma 연산 후 더해질 값
 * @param dest  결과가 저장될 곳
 */
void addWeighted(
        Mat src1, double alpha,
        Mat src2, double beta,
        double gamma,
        Mat dest
);



example)

//! 샘플 행렬
Mat x, y;
/*
 * x            y
 *  [3, 3, 3;    [2, 2, 2;
 *   3, 3, 3;     2, 2, 2;
 *   3, 3, 3]     2, 2, 2]
 */


//! 가중치가 포함된 덧셈.
Mat weighted_add;
addWeighted(x, 3, y, -2.5, 3, weighted_add);
/*
 * weighted_add
 *  (x*3) + (y*-2.5) + 3
 *  [7, 7, 7;
 *   7, 7, 7;
 *   7, 7, 7]
 */




 멀티채널 행렬의 산술연산

각 채널별로 산술연산이 발생한다.

Size size(1, 1);
Mat x = Mat(size, CV_8UC3, Scalar(4, 3, 2));
/*
 * [(4, 3, 2)]
 */

Mat y = Mat(size, CV_8UC3, Scalar(2, 3, 1));
/*
 * [(2, 3, 1)]
 */

Mat mul;
multiply(x, y, mul);
/*
 * [(8, 9, 2)]
 */