본문 바로가기

Programming

Complex number matrix division, multiply in OpenCv like Matlab (실수부와 복소수허수부 포함된 매트릭스 곱셈, 나눗셈)

 Complex number matrix division in OpenCv like Matlab 

(실수부와 복소수허수부 포함된 매트릭스 나눗셈)



 Real number part + Complex number part


You could do the math very easily in Matlab


But in OpenCV, you have to use 2 channel Mat and fill in the mat using real and complex number for showing frequency etc..



A code below is kinda dirty, but I compared Matlab code result and JavaCV code result using JUnit.


JUnit was so useful, I'll post that later after reading some.



실수부 + 허수부(복소수포함) 형식의 수는


Matlab 에서는 편하게 사칙연산을 할 수 있지만,


OpenCV 를 이용해서 처리를 하게 되면.. 2개의 채널을 가진 Matrix를 이용하고,


real (실수부) + complex (허수부) 를 이용한 matrix 의 요소들을 채워넣어주어


주파수 등을 표현하게 된다.



 코드는 일단 지저분하긴.. 하지만, 기능 자체는 matlab 에서의 계산 값과


JUnit 테스트 케이스를 따로 만들어서 확인까지 마친 코드이다.


JUnit 은 써보니까 상당히 좋은데, 나중에 Cookbook 을 읽어보거나 해서 포스팅 해야겠슴~



간단한 나눗셈..


Simple division...



Code.. let me see code!!


코드.. 코드를 보자!!!!




/**

 * 2 channel complex mat division

 * @param mat1

 * @param mat2

 * @return

 */

public static Mat mat2CDivByMat2C(final Mat mat1, final Mat mat2) {

Mat tempMat = Mat.zeros(mat1.rows(), mat1.cols(), CvType.CV_64FC2);

for (int i = 0; i < tempMat.rows(); ++i)

{

for (int j = 0; j < tempMat.cols(); ++j)

{

double[] buffer1 = mat1.get(i, j);

double[] buffer2 = mat2.get(i, j);

double[] buffer3 = buffer2.clone();

buffer3[1] = -buffer3[1];

double[] numerator = compMultiComp(buffer1, buffer3);

double denominator = Math.pow(buffer2[0], 2) + (Math.pow(buffer2[1], 2));

buffer1[0] = numerator[0] / denominator;

buffer1[1] = numerator[1] / denominator;

tempMat.put(i, j, buffer1);

}

}

       return tempMat;

}


/**

 * 2 channel complex mat multiply

 * @param complex1

 * @param complex2

 * @return

 */

public static double[] compMultiComp(final double[] complex1, final double[] complex2) {

double[] result = new double[2];

double real = (complex1[0] * complex2[0]) + (-(complex1[1] * complex2[1]));

double complex = (complex1[0] * complex2[1]) + (complex1[1] * complex2[0]);

result[0] = real;

result[1] = complex;

return result;

}




Something else you like...




2018/10/19 - [Programming/Image Processing] - Fourier transfer shift



2018/10/24 - [Algorithm/Code Fights (Code Signal)] - Aracade Intro #18 PalindromeRearranging, Codefights, CodeSignal, 코드파이트, 코드시그널, c++ java c# scalar

2018/10/24 - [Algorithm/Code Fights (Code Signal)] - Aracade Intro #17 ArrayChange, Codefights, CodeSignal, 코드파이트, 코드시그널, c++ java c# scalar

2018/10/21 - [Algorithm/Code Fights (Code Signal)] - Aracade Intro #16 AreSimilar?, Codefights, CodeSignal, 코드파이트, 코드시그널, c++ java c# scalar

2018/10/21 - [Algorithm/Code Fights (Code Signal)] - Aracade Intro #15 AddBorder, Codefights, CodeSignal, 코드파이트, 코드시그널, c++ java c# scalar

2018/10/20 - [Algorithm/Code Fights (Code Signal)] - Aracade Intro #14 AlternatingSums, Codefights, CodeSignal




2018/10/17 - [Programming/Image Processing] - OpenCV - CvType (Mat datatype) 오픈cv 매트릭스 데이터타입

2018/10/16 - [Programming/Image Processing] - OpenCV (Java) How to change Mat to Image, and save 2 (OpenCV Mat 에서 Image 변환, 저장) 2

2018/10/16 - [Programming/Image Processing] - OpenCV (Java) How to change Mat to Image, and save (OpenCV Mat 에서 Image 변환, 저장)