행렬의 산술연산 종류
마스킹 산술연산
마스킹 덧셈
마스킹 뺄셈
마스크가 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)] */
'# 미사용 > OpenCV' 카테고리의 다른 글
[OpenCV] 이진화 (1) BINARY, BINARY_INV (0) | 2019.11.01 |
---|---|
[OpenCV] 행렬의 비트연산 (0) | 2019.11.01 |
[OpenCV] 채널의 분리, 병합, 혼합 (0) | 2019.10.31 |
[OpenCV] 행렬의 대칭, 전치, 반복 (0) | 2019.10.30 |
[OpenCV] 기본도형 그리기 (0) | 2019.10.29 |