一、效果
二、代码
var image1 = new Image<Bgr, byte>("bird1.png");
var image0 = image1.Mat.Clone();
PreviewImage1 = new WriteableBitmap(Bitmap2BitmapImage(Text(image1.Bitmap, "原图")));
var imgGray = new Mat();
CvInvoke.CvtColor(image0, imgGray, ColorConversion.Bgr2Gray);
PreviewImage2 = new WriteableBitmap(Bitmap2BitmapImage(Text(imgGray.Bitmap, "灰度")));
var imgR= imgGray.Clone();
imgR.ConvertTo(imgR,DepthType.Cv32F);
var imgI = Mat.Zeros(imgGray.Rows,imgGray.Cols,DepthType.Cv32F,1);
VectorOfMat vectorOfMat = new VectorOfMat();
vectorOfMat.Push(imgR);
vectorOfMat.Push(imgI);
var img = new Mat(imgR.Size,DepthType.Cv32F,2);
CvInvoke.Merge(vectorOfMat,img);
Mat fourier = new Mat(imgR.Size, DepthType.Cv32F, 2);
CvInvoke.Dft(img, fourier,DxtType.Forward,imgR.Rows);
Mat magnitudeImage = Magnitude(fourier);
SwitchQuadrants(ref magnitudeImage);
var img7 = magnitudeImage.Clone();
CvInvoke.Normalize(magnitudeImage, magnitudeImage, 0, 255, NormType.MinMax, DepthType.Cv8U);
PreviewImage3 = new WriteableBitmap(Bitmap2BitmapImage(Text(magnitudeImage.Bitmap, "傅里叶变换")));
private Mat Magnitude(Mat fftData)
{
Mat Real = new Mat(fftData.Size, DepthType.Cv32F, 1);
Mat Imaginary = new Mat(fftData.Size, DepthType.Cv32F, 1);
VectorOfMat channels = new VectorOfMat();
CvInvoke.Split(fftData, channels);
Real = channels.GetOutputArray().GetMat(0);
Imaginary = channels.GetOutputArray().GetMat(1);
CvInvoke.Pow(Real, 2.0, Real);
CvInvoke.Pow(Imaginary, 2.0, Imaginary);
CvInvoke.Add(Real, Imaginary, Real);
CvInvoke.Pow(Real, 0.5, Real);
Mat onesMat = Mat.Ones(Real.Rows, Real.Cols, DepthType.Cv32F, 1);
CvInvoke.Add(Real, onesMat, Real);
CvInvoke.Log(Real, Real);
return Real;
}
private void SwitchQuadrants(ref Mat mat)
{
int cx = mat.Cols / 2;
int cy = mat.Rows / 2;
Mat q0 = new Mat(mat, new Rectangle(0, 0, cx, cy));
Mat q1 = new Mat(mat, new Rectangle(cx, 0, cx, cy));
Mat q2 = new Mat(mat, new Rectangle(0, cy, cx, cy));
Mat q3 = new Mat(mat, new Rectangle(cx, cy, cx, cy));
Mat temp = new Mat(q0.Size, DepthType.Cv32F, 1);
q0.CopyTo(temp);
q3.CopyTo(q0);
temp.CopyTo(q3);
q1.CopyTo(temp);
q2.CopyTo(q1);
temp.CopyTo(q2);
}