Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Image processing 对傅里叶图像进行滤波,然后取其逆傅里叶得到图像 //图像原始对象的傅里叶变换。 //输出为2通道矩阵。 私有矩阵fourier() { Image=orig.Convert(); IntPtr complexImage=CvInvoke.cvCreateImage(image.Size,Emgu.CV.CvEnum.IPL_DEPTH.IPL_DEPTH_32F,2); CvInvoke.cvSetZero(complexImage);//将所有元素初始化为零 CvInvoke.cvSetImageCOI(complexImage,1); CvInvoke.cvCopy(image,complexImage,IntPtr.Zero); CvInvoke.cvSetImageCOI(complexImage,0); 矩阵dft=新矩阵(image.Rows,image.Cols,2); CvInvoke.cvDFT(complexImage,dft,Emgu.CV.CvEnum.CV_DXT.CV_DXT_FORWARD,0); //傅里叶变换的实部 矩阵outReal=新矩阵(image.Size); //傅里叶变换的虚部 矩阵outIm=新矩阵(图像大小); CvInvoke.cvSplit(dft、outReal、outIm、IntPtr.Zero、IntPtr.Zero); 返回dft; } //频率和阶数为n的巴特沃斯滤波器。 //过滤器作为矩阵返回,有2个通道。 私有矩阵make_butterworth(int Do,int n) { 矩阵ff=傅里叶(); 矩阵tmp=新矩阵(ff.Rows,ff.Cols,2); 点中心=新点(tmp.Rows/2,tmp.Cols/2); 对于(inti=0;i_Image Processing_Filtering_Emgucv_Frequency Domain - Fatal编程技术网

Image processing 对傅里叶图像进行滤波,然后取其逆傅里叶得到图像 //图像原始对象的傅里叶变换。 //输出为2通道矩阵。 私有矩阵fourier() { Image=orig.Convert(); IntPtr complexImage=CvInvoke.cvCreateImage(image.Size,Emgu.CV.CvEnum.IPL_DEPTH.IPL_DEPTH_32F,2); CvInvoke.cvSetZero(complexImage);//将所有元素初始化为零 CvInvoke.cvSetImageCOI(complexImage,1); CvInvoke.cvCopy(image,complexImage,IntPtr.Zero); CvInvoke.cvSetImageCOI(complexImage,0); 矩阵dft=新矩阵(image.Rows,image.Cols,2); CvInvoke.cvDFT(complexImage,dft,Emgu.CV.CvEnum.CV_DXT.CV_DXT_FORWARD,0); //傅里叶变换的实部 矩阵outReal=新矩阵(image.Size); //傅里叶变换的虚部 矩阵outIm=新矩阵(图像大小); CvInvoke.cvSplit(dft、outReal、outIm、IntPtr.Zero、IntPtr.Zero); 返回dft; } //频率和阶数为n的巴特沃斯滤波器。 //过滤器作为矩阵返回,有2个通道。 私有矩阵make_butterworth(int Do,int n) { 矩阵ff=傅里叶(); 矩阵tmp=新矩阵(ff.Rows,ff.Cols,2); 点中心=新点(tmp.Rows/2,tmp.Cols/2); 对于(inti=0;i

Image processing 对傅里叶图像进行滤波,然后取其逆傅里叶得到图像 //图像原始对象的傅里叶变换。 //输出为2通道矩阵。 私有矩阵fourier() { Image=orig.Convert(); IntPtr complexImage=CvInvoke.cvCreateImage(image.Size,Emgu.CV.CvEnum.IPL_DEPTH.IPL_DEPTH_32F,2); CvInvoke.cvSetZero(complexImage);//将所有元素初始化为零 CvInvoke.cvSetImageCOI(complexImage,1); CvInvoke.cvCopy(image,complexImage,IntPtr.Zero); CvInvoke.cvSetImageCOI(complexImage,0); 矩阵dft=新矩阵(image.Rows,image.Cols,2); CvInvoke.cvDFT(complexImage,dft,Emgu.CV.CvEnum.CV_DXT.CV_DXT_FORWARD,0); //傅里叶变换的实部 矩阵outReal=新矩阵(image.Size); //傅里叶变换的虚部 矩阵outIm=新矩阵(图像大小); CvInvoke.cvSplit(dft、outReal、outIm、IntPtr.Zero、IntPtr.Zero); 返回dft; } //频率和阶数为n的巴特沃斯滤波器。 //过滤器作为矩阵返回,有2个通道。 私有矩阵make_butterworth(int Do,int n) { 矩阵ff=傅里叶(); 矩阵tmp=新矩阵(ff.Rows,ff.Cols,2); 点中心=新点(tmp.Rows/2,tmp.Cols/2); 对于(inti=0;i,image-processing,filtering,emgucv,frequency-domain,Image Processing,Filtering,Emgucv,Frequency Domain,请阅读本章:,它解释了您需要了解的有关opencv中DFT的所有信息。 关于类型 1) 图像是真实的 2) DFT(图像)会产生复杂的图像 3) butterworth是具有相同图像大小的单通道矩阵 4) 要进行滤波,请将DFT结果图像的每个通道乘以巴特沃斯滤波器。每个通道必须分开使用,因为我们在一个通道中分配了每个像素的实部和复部作为DFT的结果 5) 过滤后,您将有一个复杂的图像 6) 现在,您可以应用IDFT,其结果是真实图像。在opencv中,您可能会得到复杂图像,但第二个通道完全为零,

请阅读本章:,它解释了您需要了解的有关opencv中DFT的所有信息。 关于类型

1) 图像是真实的

2) DFT(图像)会产生复杂的图像

3) butterworth是具有相同图像大小的单通道矩阵

4) 要进行滤波,请将DFT结果图像的每个通道乘以巴特沃斯滤波器。每个通道必须分开使用,因为我们在一个通道中分配了每个像素的实部和复部作为DFT的结果

5) 过滤后,您将有一个复杂的图像

6) 现在,您可以应用IDFT,其结果是真实图像。在opencv中,您可能会得到复杂图像,但第二个通道完全为零,因此您可以进行分解


查看此处:

请下次发表更好的评论!您的代码不足以表达任何内容,请发布更多信息。FFT的管道是:1)加载图像2)创建滤波器3)应用FFT获得图像频谱(复图像)4)将频谱乘以滤波器(复结果)5)对结果(真实图像)应用IFFT请检查编辑。谢谢
       // Fourier transform of Image<Bgr,byte> orig object.
       // output is matrix<float> with 2 channels.

        private Matrix<float> fourier()
    {
        Image<Gray, float> image = orig.Convert<Gray, float>();
        IntPtr complexImage = CvInvoke.cvCreateImage(image.Size,Emgu.CV.CvEnum.IPL_DEPTH.IPL_DEPTH_32F, 2);

        CvInvoke.cvSetZero(complexImage);  // Initialize all elements to Zero
        CvInvoke.cvSetImageCOI(complexImage, 1);
        CvInvoke.cvCopy(image, complexImage, IntPtr.Zero);
        CvInvoke.cvSetImageCOI(complexImage, 0);

        Matrix<float> dft = new Matrix<float>(image.Rows, image.Cols, 2);
        CvInvoke.cvDFT(complexImage, dft, Emgu.CV.CvEnum.CV_DXT.CV_DXT_FORWARD, 0);

        //The Real part of the Fourier Transform
        Matrix<float> outReal = new Matrix<float>(image.Size);
        //The imaginary part of the Fourier Transform
        Matrix<float> outIm = new Matrix<float>(image.Size);
        CvInvoke.cvSplit(dft, outReal, outIm, IntPtr.Zero, IntPtr.Zero);
        return dft;
    }

    // butterworth filter with Do frequency and order n.
    // Filter is returned as matrix<float> with 2 channels. 

    private Matrix<float> make_butterworth(int Do, int n)
    {
        Matrix<float> ff = fourier();
        Matrix<float> tmp = new Matrix<float>(ff.Rows, ff.Cols, 2);

        Point center=new Point(tmp.Rows/2,tmp.Cols/2);

        for (int i=0;i<orig.Rows;i++)
            for (int j = 0; j < orig.Cols; j++)
            {
                  int Duv= (int) (Math.Sqrt( Math.Pow(i-center.X,2) + Math.Pow(j-center.Y,2)));
                  tmp[i, j] = (float) (1 / (1 + Math.Pow((Duv / Do), 2 * n)));
            }

        return tmp;
    }


    // The click event which will trigger fourier() and
       make_butterworth() takes Do and n order input from user
       and applies filter on orig image.

    private void lowPassToolStripMenuItem2_Click(object sender, EventArgs e)
    {
        dialog_input d1 = new dialog_input("Enter values of Do and order n seperated by space:\n");
        d1.ShowDialog();
        string[] s = d1.t.Split(new char[] { ' ', ',' });
        int fc = Convert.ToInt32(s[0]);
        int order = Convert.ToInt32(s[1]);

        Matrix<float> filter= make_butterworth(fc, order); // 2 channels
        Matrix<float> m = fourier(); // 2 channels
        m._Mul(filter);
        // filter * with fourier image.
        CvInvoke.cvDFT(m,m,CV_DXT.CV_DXT_INVERSE, 0);

        IntPtr cmplx = CvInvoke.cvCreateImage(m.Size, IPL_DEPTH.IPL_DEPTH_32F, 2);
        CvInvoke.cvSetZero(cmplx);
        CvInvoke.cvSetImageCOI(cmplx, 0);
        CvInvoke.cvCopy(m, cmplx, IntPtr.Zero);

        Bitmap bm = new Bitmap(m.Width, m.Height);

        BitmapData bd = bm.LockBits(new Rectangle
            (0, 0, bm.Width, bm.Height),
            ImageLockMode.ReadWrite,
            PixelFormat.Canonical);

        bd.Scan0 = cmplx;

        bm.UnlockBits(bd);
        pictureBox2.Image = bm;
      }