2014-09-12 107 views
0

以下是查找64 * 64图像的DFT的代码。这是一个3频道的图像,所以我正在从中提取绿色通道并对其进行处理。我认为该计划没有给出所需的输出。请检查它并让我知道我是对还是错?查找64 * 64图像的离散傅里叶变换

这是我使用

This is the image i am using

#include "stdafx.h" 
    #include "opencv\highgui.h" 
    #include "opencv\cv.h" 

    using namespace cv; 
    #define _USE_MATH_DEFINES 
    #include<math.h> 
    #include<iostream> 
    #include<complex> 


    int main() 
    { 
     Mat im = imread("joker.jpg"); 
     Mat im1(64, 64, CV_8UC1); 
     Mat im2(64, 64, CV_64FC1); 
     int from_to[] = {1,0}; 

     mixChannels(&im, 1, &im1, 1, from_to, 1); 

     for (int u = 0; u < 64; u++) 
     { 
      for (int v = 0; v <64; v++) 
      { 
       double sum1 = 0, sum2 = 0; 

       for (int x = 0; x < 64; x++) 
       { 

        for (int y = 0; y < 64; y++) 
        { 
    auto c = std::complex<double>(cos(2 * M_PI*(u*x/64.0 + v*y/64.0)), -sin(2 * M_PI*(u*x/64.0 + v*y/64.0))); 
         double temp2 = std::real(c); 
         double temp3 = std::imag(c); 
         sum1 = sum1 + im1.at<uchar>(x,y) * temp2; 
         sum2 = sum2 + im1.at<uchar>(x,y) * temp3; 
        } 

       } 
/* Finding the Frquency spectrum */ 
       double t = round(sqrt(pow(sum1, 2) + pow(sum2, 2))); 
       im2.at<double>(u, v) = t; 

      } 

     } 

     double min, max; 
     minMaxIdx(im2, &min, &max); 

    /*Scaling to a range between 0 - 255 */ 

     for (int i = 0; i < 64; i++) 
     { 
      for (int j = 0; j < 64; j++) 
      { 
       im2.at<double>(i, j) = 255/(max - min)*(im2.at<double>(i, j)-min); 
      } 
     } 
     namedWindow("output2"); 
     imshow("output2", im2); 

waitkey(0); 

} 

回答

1

与(总不科学)替换最终转换代码的图像:

Mat im3; 
im2.convertTo(im3, CV_8U, .04); 
imshow("output2", im3); 

给出:

enter image description here

还,因为它是一个灰度IMG,可以简化输入:

Mat im1 = imread("joker.jpg", 0); // read as 1chan grayscale 

,并跳过mixChannels部分


为它的乐趣,让我们尝试OpenCV中的内置DCT)

Mat im = imread("joker.jpg", 0); 
im.convertTo(im1, CV_64F, 1.0/255); // [0..1] 

Mat im2; 
dct(im1,im2); 

Mat im3; 
im2.convertTo(im3, CV_8U, 255); //[0..255] 
imshow("output2", im3); 

enter image description here

+0

为什么在第一个C onvertTo函数缩放1/255,第二个缩放255? – Navdeep 2014-09-12 11:01:40

+0

使其进入[0..1]范围。 (以及更多的显示convertTo功能),但结果是相同的,如果我跳过*转换的比例因子 – berak 2014-09-12 11:04:07

+0

以下语句给出的输出图像只包含直流分量im2.convertTo(im3,CV_8UC1);但下面的声明给出了一个完整的黑色图像。 im2.convertTo(im3,CV_8UC1,.04);为什么这样?请解释。 – Navdeep 2014-09-12 14:23:33