精华内容
下载资源
问答
  • OpenCV傅里叶变换

    千次阅读 2017-10-07 13:20:49
    OpenCV傅里叶变换

    傅里叶变换可以将图像的时域信号转换到频域,通过频域我们可以看到信号的另一面。我们可以在频域对图像进行滤波等处理,然后通过傅里叶反变换,将频域图像转换回时域,就可以看到处理后的图像。

     

    实际应用中,更多的是在频域进行滤波器设计,设计合适的滤波器,然后将滤波器经过傅里叶反变换生成时域滤波器,最后在时域进行滤波操作。

     

    下面通过一个例子,看看如何使用OpenCV进行傅里叶变换及其反变换。

     

    import cv2
    import numpy as np
    import matplotlib.pyplot as plt
    
    image = cv2.imread(r'pics/lena.png', cv2.IMREAD_GRAYSCALE)
    
    dft = cv2.dft(np.float32(image), flags=cv2.DFT_COMPLEX_OUTPUT)
    dft_shift = np.fft.fftshift(dft)
    magnitude_spectrum = 20*np.log(cv2.magnitude(dft_shift[:, :, 0], dft_shift[:, :, 1]))


    导入相应的包后,先读取灰度图像,使用OpenCV的dft函数,可以进行傅里叶变换,之后使用numpy的fft模块的fftshift对频域进行中心化,这样更便于观察我们的频域图像。最后我们求取了频域的分贝表示的幅值,便于绘制。

     

     

    image_back = np.fft.ifftshift(dft_shift)
    image_back = cv2.idft(image_back)
    image_back = cv2.magnitude(image_back[:, :, 0], image_back[:, :, 1])
    


    接下来,我们直接对傅里叶变换后的数据进行了去中心化,然后利用OpenCV的idft函数进行了傅里叶反变换。之后重新求取反变换后的图像幅值,这样,我们就还原了原来的图像。

     

     

     

     

    rows, cols = image.shape
    center_x, center_y = int(rows/2), int(cols/2)
    dft_shift[center_x-30:center_x+30, center_y-30:center_y+30] = 0
    filter_back = np.fft.ifftshift(dft_shift)
    filter_back = cv2.idft(filter_back)
    filter_back = cv2.magnitude(filter_back[:, :, 0], filter_back[:, :, 1])


    接下来我们更进一步,使用傅里叶变换后的dft_shitf数据,将其中心部分半径为30的频率值置为0。之后同样进行了去中心化和傅里叶反变换,求取幅值后,就得到了滤波后的图像。

     

     

     

     

    plt.subplot(221), plt.imshow(image, 'gray'), plt.title('Origin')
    plt.subplot(222), plt.imshow(magnitude_spectrum, 'gray'), plt.title('Fourier TransForm')
    plt.subplot(223), plt.imshow(image_back, 'gray'), plt.title('Origin Back')
    plt.subplot(224), plt.imshow(filter_back, 'gray'), plt.title('Transform Back')
    plt.show()


    之后绘制了上面的四个图像,结果如下图。

     

     

     

    右上角的图像就是频率谱,图像中越亮的部分代表频率幅值越小,上面的代码我们滤除了中心最亮的亮点,实际上就是滤除了最低频的部分,也就是说我们进行了高通滤波。

     

    另外,需要特别说明一下,右下角是高通滤波后的图像,如果放大来看,可以看到振铃现象,这是由于我们使用的频域滤波器有陡峭的边缘,会导致振铃的发生,其数学原理不再赘述,有很多文章进行了说明,可以查阅。

     

     

    展开全文
  • opencv傅里叶变换

    2021-07-27 20:23:17
    opencv傅里叶变换 分享一篇关于傅里叶变换的讲解。这能阐述我们为什么要对图像进行傅里叶变换https://www.cnblogs.com/h2zZhou/p/8405717.html

    opencv傅里叶变换

    分享一篇关于傅里叶变换的讲解。这能阐述我们为什么要对图像进行傅里叶变换https://www.cnblogs.com/h2zZhou/p/8405717.html

    展开全文
  • OpenCV 傅里叶变换

    2020-03-01 22:52:51
    介绍了opencv实现傅里叶变换的方法。

    任何连续的周期信号,可以由一组适当的正弦曲线组合而成 ——傅里叶

    傅里叶变换
    反傅里叶变换
    shift
    ishift
    cv.magnitude
    np.abs
    原图
    复数数组
    低频移动
    频域范围处理
    结果

    函数 dft

    傅里叶变换:

    dft = cv2.dft(np.float32(img),flags=cv2.DFT_COMPLEX_OUTPUT)
    #图像需要转换为float32格式,同时需要一个关键词
    

    函数 idft

    反傅里叶变换:

    idft = cv2.idft(ishift)
    

    函数 magnitude

    数值转换:
    在这里插入图片描述

    示例

    import cv2
    import numpy as np
    import matplotlib.pyplot as plt
    	#1.进行傅里叶变换并移动低频
    img = cv2.imread('./hanser.jpg',0)
    dft = cv2.dft(np.float32(img),flags=cv2.DFT_COMPLEX_OUTPUT)
    fshift = np.fft.fftshift(dft)
    	#2.剔除低频,通高频
    rows,cols = img.shape
    crow,ccol = int(rows/2),int(cols/2)
    fshift[crow-30:crow+30,ccol-30:ccol+30] = 0
    	#3.反傅里叶变换、格式转换
    idft = cv2.idft(np.fft.ifftshift(fshift))
    result = cv2.magnitude(idft[:,:,0],idft[:,:,1])
    	#4.图片展示
    plt.subplot(121),plt.imshow(img,cmap='gray')
    plt.title('original'),plt.axis('off')
    plt.subplot(122),plt.imshow(result,cmap='gray')
    plt.title('iimg'),plt.axis('off')
    plt.show()
    

    在这里插入图片描述

    展开全文
  • OpenCV傅里叶变换及逆变换实现代码,机器视觉使用
  • opencv 傅里叶变换

    2019-12-30 14:56:08
    opencv 实现傅里叶变换,必须承认工程师、码农还真的不是一回事,做个笔记保存下吧先,傅里叶还真的看不明白!!! 代码: int main() { //C:/Users/liyihang/Desktop/sc/out.png Mat I = imread("C:/Users/...

    opencv 实现傅里叶变换,必须承认工程师、码农还真的不是一回事,做个笔记保存下吧先,傅里叶还真的看不明白!!!

    代码:

    int main()
    {
    
    	//C:/Users/liyihang/Desktop/sc/out.png
    
        Mat I = imread("C:/Users/liyihang/Desktop/sc/out.png", IMREAD_GRAYSCALE);       //读入图像灰度图
    
        //判断图像是否加载成功
        if (I.empty())
        {
            cout << "图像加载失败!" << endl;
            return -1;
        }
        else
            cout << "图像加载成功!" << endl << endl;
    
        Mat padded;                 //以0填充输入图像矩阵
        int m = getOptimalDFTSize(I.rows);
        int n = getOptimalDFTSize(I.cols);
    
        //填充输入图像I,输入矩阵为padded,上方和左方不做填充处理
        copyMakeBorder(I, padded, 0, m - I.rows, 0, n - I.cols, BORDER_CONSTANT, Scalar::all(0));
    
        Mat planes[] = { Mat_<float>(padded), Mat::zeros(padded.size(),CV_32F) };
        Mat complexI;
        merge(planes, 2, complexI);     //将planes融合合并成一个多通道数组complexI
    
        dft(complexI, complexI);        //进行傅里叶变换
    
        //计算幅值,转换到对数尺度(logarithmic scale)
        //=> log(1 + sqrt(Re(DFT(I))^2 + Im(DFT(I))^2))
        split(complexI, planes);        //planes[0] = Re(DFT(I),planes[1] = Im(DFT(I))
                                        //即planes[0]为实部,planes[1]为虚部
        magnitude(planes[0], planes[1], planes[0]);     //planes[0] = magnitude
        Mat magI = planes[0];
    
        magI += Scalar::all(1);
        log(magI, magI);                //转换到对数尺度(logarithmic scale)
    
        //如果有奇数行或列,则对频谱进行裁剪
        magI = magI(Rect(0, 0, magI.cols & -2, magI.rows & -2));
    
        //重新排列傅里叶图像中的象限,使得原点位于图像中心
        int cx = magI.cols / 2;
        int cy = magI.rows / 2;
    
        Mat q0(magI, Rect(0, 0, cx, cy));       //左上角图像划定ROI区域
        Mat q1(magI, Rect(cx, 0, cx, cy));      //右上角图像
        Mat q2(magI, Rect(0, cy, cx, cy));      //左下角图像
        Mat q3(magI, Rect(cx, cy, cx, cy));     //右下角图像
    
        //变换左上角和右下角象限
        Mat tmp;
        q0.copyTo(tmp);
        q3.copyTo(q0);
        tmp.copyTo(q3);
    
        //变换右上角和左下角象限
        q1.copyTo(tmp);
        q2.copyTo(q1);
        tmp.copyTo(q2);
    
        //归一化处理,用0-1之间的浮点数将矩阵变换为可视的图像格式
        normalize(magI, magI, 0, 1, NORM_MINMAX);
    
        imshow("输入图像", I);
        imshow("频谱图", magI);
    
    	waitKey(0);
    	return 0;
    }
    
    展开全文
  • Opencv傅里叶变换

    2019-09-19 11:49:58
    Opencv计算机视觉之路(三)——图像处理(一)傅里叶变换 傅里叶变换: 1、双通道图 import cv2 import numpy as np import matplotlib.pyplot as plt """ 低通滤波器:只保留低频,会使得图像模糊 高通滤波器:...
  • opencv 傅里叶使用

    2019-02-25 20:08:00
    opencv2/opencv.hpp>#include<iostream>using namespace std;using namespace cv;int main(int a, char **p){ //Mat input = imread(p[1], CV_LOAD_IMAGE_GRAYSCALE);//以灰度图像的方式读入图片 //如果...
  • opencv傅里叶变换实例

    2020-01-14 16:54:36
    OpenCV快速傅里叶变换实例 int main() { Mat I = imread("ted_cruz.jpg", CV_LOAD_IMAGE_GRAYSCALE); if (I.empty()) return -1; cout << I.size() << endl; Mat ...
  • OpenCV傅里叶变换篇

    2021-06-28 14:31:09
    OpenCV傅里叶变换傅里叶变换理论基础实现逆傅里叶变换 傅里叶变换 讲傅里叶变换前,首先介绍一下图像处理,图像处理一般分为空间域处理和频率处理。 空间域处理是直接对图像内的像素点进行处理。而我们今天要讲的...
  • 文章目录 一、基础概念 1.1 频域基础概念 1.1.1 频谱(频域图像,正弦波振幅) 1.1.2 相位谱(正弦波相位) 1.1.3 频率 1.2 傅里叶变换 1.2.1 概念 离散频谱和连续频谱 复数 欧拉公式 1.2.2 傅里叶变换 一、基础概念 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,188
精华内容 1,675
关键字:

opencv傅立叶