在OpenCV中将复杂的垫子与真正的垫子分开
Divide complex Mat with real Mat in OpenCV
如何在OpenCV中将复杂的垫子与真正的垫子分开?我想计算相位相关的交叉功率谱,但在使用分频时出现运行时错误。
更新我想出了一种计算交叉功率谱的方法,但我没有得到合适的结果来找到图像的平移。下面是代码。我拆分了反向 dft 的结果,因为它有两个通道。然后,我能够划分,但结果不适合仅在水平轴上进行翻译。应该只有一个最大值,但有很多最大值。
图像
void computeFFTMag(Mat&,Mat&,Mat&);
string getImgType(int );
int main( int argc, char** argv )
{
Mat ref,sens,refMag,sensMag,refFFT,sensFFT;
ref = imread("lena1.jpg",CV_LOAD_IMAGE_GRAYSCALE);
sens = imread("lena3.jpg",CV_LOAD_IMAGE_GRAYSCALE);
namedWindow( "Sensed Image", CV_WINDOW_AUTOSIZE );
imshow( "Sensed Image", sens );
computeFFTMag(ref,refMag,refFFT);
computeFFTMag(sens,sensMag,sensFFT);
Mat R1,R2,R,r,rf[2],rff;
mulSpectrums(refFFT,sensFFT,R1,0,true);
multiply(refMag,sensMag,R2);
dft(R1,r,DFT_REAL_OUTPUT);
split(r,rf);
divide(rf[0],R2,r);
normalize(r, r, 0, 1, CV_MINMAX);
namedWindow( "Reference Image", CV_WINDOW_AUTOSIZE );
imshow("Reference Image" , r );
}
void computeFFTMag(Mat& input,Mat& fftMag,Mat& complexFFT){
Mat inputPadded;
/*int r=getOptimalDFTSize(input.rows);
int c=getOptimalDFTSize(input.cols);
copyMakeBorder(input,inputPadded,0,r-input.rows,0,c-input.cols,BORDER_CONSTANT, Scalar::all(0));*/
Mat fftPlanes[] = {Mat_<float>(input), Mat::zeros(input.size(), CV_32F)};
//Mat complexFFT;
merge(fftPlanes, 2, complexFFT);
dft(complexFFT,complexFFT);
split(complexFFT,fftPlanes);
magnitude(fftPlanes[0],fftPlanes[1],fftPlanes[0]);
fftMag=fftPlanes[0];
//fftMag = fftMag(Rect(0, 0, fftMag.cols & -2, fftMag.rows & -2));
int cx = fftMag.cols/2;
int cy = fftMag.rows/2;
Mat q0(fftMag, Rect(0, 0, cx, cy)); // Top-Left - Create a ROI per quadrant
Mat q1(fftMag, Rect(cx, 0, cx, cy)); // Top-Right
Mat q2(fftMag, Rect(0, cy, cx, cy)); // Bottom-Left
Mat q3(fftMag, Rect(cx, cy, cx, cy)); // Bottom-Right
Mat tmp; // swap quadrants (Top-Left with Bottom-Right)
q0.copyTo(tmp);
q3.copyTo(q0);
tmp.copyTo(q3);
q1.copyTo(tmp); // swap quadrant (Top-Right with Bottom-Left)
q2.copyTo(q1);
tmp.copyTo(q2);
}
复数可以通过将实数和复数除以相同的标量来除以标量。因此,(2 + 3i)/4 等于 2/4 + (3/4)i。
OpenCV 不允许您使用标量垫对复杂垫进行元素划分,但它确实允许您使用复杂垫进行复杂垫的元素划分。您可以通过创建一个复杂的矩阵来使除法起作用,其中实部和虚部都与要除以的实数垫中的实值相同。
// Goal: Divide 'complex' by 'real'
Mat complex = Mat(rows, cols, CV_32FC2);
Mat real = Mat(rows, cols, CV_32FC1);
Mat channels[2] = {real, real};
Mat divisor = Mat(rows, cols, CV_32FC2);
merge(channels, 2, divisor);
Mat result = Mat(rows, cols, CV_32FC2);
divide(complex, divisor, result);
相关文章:
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- 尝试导入pybind-opencv模块时出现libgtk错误
- 在编译C++代码(具有dlib和opencv)到WASM时面临问题
- 如何使用OpenCV将RBG图像转换为HSV,并将H、S和V值保存为C++中的3个独立图像
- OpenCV EqualizeHist()从彩色图像创建黑白图像
- 函数复杂度分析
- 将OpenCV C++重写为EmguCV C#-如何使用指针
- 向量 <int> a {N, 0} 和 int arr a[N] = {0} 的时间复杂度有什么区别
- while循环中while循环的时间复杂度是多少
- OpenCV C++.快速计算混淆矩阵
- 在C++代码中包含opencv时,使用ctypes创建.so文件
- 哪些库可以通过Opencv调整曝光率
- 安装opencv失败-粘贴CMakeError.log的内容
- C++中的openCV Mat访问冲突
- OpenCV Android C++ imwrite not found
- 未定义的引用 .. 使用 OpenCV 编译 C++ 代码时,从命令行
- OpenCV 傅里叶变换复杂输出问题
- 在OpenCV中将复杂的垫子与真正的垫子分开
- opencv:检测最小矩形的时间复杂度
- 使用 opencv 和 c++ 找到与复杂形状最接近的匹配的最佳方法是什么?