1. 程式人生 > >opencv實現傅立葉變換

opencv實現傅立葉變換

    const char* filename = argc >=2 ? argv[1] : "lena.jpg";
    Mat I = imread(filename, CV_LOAD_IMAGE_GRAYSCALE);

原始影象:
這裡寫圖片描述
獲取最佳的圖片尺寸,滿足大小能夠分解成2、3、5等因素的最小整數,能得到最大的計算效能,並作必要的填充。

     Mat padded;                            //expand input image to optimal size
     int m = getOptimalDFTSize( I.rows );
     int
n = getOptimalDFTSize( I.cols ); // on the border add zero values copyMakeBorder(I, padded, 0, m - I.rows, 0, n - I.cols, BORDER_CONSTANT, Scalar::all(0));

傅立葉變換結果是複數,所以需要申請兩個通道的影象,一個儲存計算結果的實部,另外一個存放dft結果的虛部,並且頻域的數字大於空域的資料還是小數,所以這裡採用浮點數表示。將原始影象轉換為浮點數表示。

Mat planes[] = {Mat_<float>(padded), Mat::zeros(padded.size
(), CV_32F)}; Mat complexI; merge(planes, 2, complexI); // Add to the expanded another plane with zeros

傅立葉變換:

dft(complexI, complexI);   

計算傅立葉變換幅值:
將complexI分拆,planes[0]是實部,planes[1]是虛部。按照公式:log(1 + sqrt(Re(DFT(I))^2 + Im(DFT(I))^2))計算幅值,+1是為了保證不出現複數結果。同時幅值通常是遠遠大於255,同時為了能夠看到小的變化和大變化的幅值,對結果取對數

// compute the magnitude and switch to 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))
magnitude(planes[0], planes[1], planes[0]);// planes[0] = magnitude
Mat magI = planes[0];
magI += Scalar::all(1);                    // switch to logarithmic scale
log(magI, magI);

歸一化並現顯示:

    normalize(magI, magI, 0, 1, CV_MINMAX); // Transform the matrix with float values into a
    imshow("not shift", magI);

影象如下:
這裡寫圖片描述
看著不太舒服,把影象的座標移到中心。
把影象分為四個象限,分別是左上角、右上角、左下角、右下角。
左上角跟右下角交換,右上角跟左下角交換。

    // rearrange the quadrants of Fourier image  so that the origin is at the image center
    int cx = magI.cols / 2;
    int cy = magI.rows / 2;

    Mat q0(magI, Rect(0, 0, cx, cy));   // Top-Left - Create a ROI per quadrant
    Mat q1(magI, Rect(cx, 0, cx, cy));  // Top-Right
    Mat q2(magI, Rect(0, cy, cx, cy));  // Bottom-Left
    Mat q3(magI, 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);

最終影象

    imshow("Input Image", I);    // Show the result
    imshow("spectrum magnitude", magI);

這裡寫圖片描述
最終可以看出是關於原點對稱的。
要用傅立葉變換來做一些分析,最好採用幅值和相位的直接結果,而不是對數變換後的結果。

相關推薦

opencv實現變換

const char* filename = argc >=2 ? argv[1] : "lena.jpg"; Mat I = imread(filename, CV_LOAD_IMAGE_GRAYSCALE); 原始影象: 獲

分別用OpenCV-Python和Numpy實現變換和逆變換

Numpy實現 fft = np.fft.fft2(img) 將空間域轉化為頻率域 OpenCV實現 dft = cv2.dft(np.float32(img),flag=cv2.DFT_COMPLEX_OUTPUT) 這個函式與np.fft.fft2(img)實現相同的功能,但要注意先

opencv變換 FFT

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

java 實現變換演算法 及複數的運算

最近專案需求,需要把python中的演算法移植到java上,其中有一部分需要用到複數的運算和傅立葉變換演算法,廢話不多說 如下: package qrs; /** * 複數的運算 * */ public class Complex { private final double

OpenCV基於變換以及霍夫直線檢測的旋轉文字校正

最近剛好結束了霍夫三部曲以及離散傅立葉變換的總結,剛好了解到它們兩個的結合可以實現一個很有意思的功能 旋轉文字影象的校正,於是參考了幾篇部落格,記錄下來。 主要參考部落格: 標準霍夫直線檢測 以及影象的傅立葉變換 關於傅立葉變換的原理請看我的上一篇部落格,也是為這篇文章

語音學習筆記2------matlab實現變換

Matlab是一個在很多科學和工程領域都非常有用的數學工具。傅立葉變換在訊號處理、物理、通訊、地質學、天文學、光學等很多領域都有應用。這個技術將一個函式或是一組資料從時域或是取樣域變換到頻域。這意味著,傅立葉變換可以展示一組時間序列資料的頻率分量。離散傅立葉變換是將取樣域的

變換及其在opencv中影象去噪的實現

前言 我保證這篇文章和你以前看過的所有文章都不同,這是12年還在果殼的時候寫的,但是當時沒有來得及寫 完就出國了……於是拖了兩年,嗯,我是拖延症患者…… 這篇文章的核心思想就是: 要讓讀者在不看任何數學公式的情況下理解傅立葉分析。 傅立葉分析不僅僅是一個數學工

OpenCV下利用變換和逆變換實現影象卷積演算法,並附自己對於卷積核/模板核算子的理解!

學過訊號與系統的人都知道,卷積運算一般是轉化成頻率乘積再求逆來計算,因為這樣可以減少計算量,提高程式碼的效率。 影象卷積操作廣泛應用在影象濾波技術中。 影象卷積運算中一個重要概念是卷積核算子,它是模板核算子的一種,模板核算子實際上就是一個視窗矩陣,用這個視窗按畫素點滑動去

影象變換與逆變換OpenCV實現

程式碼步驟: 讀入影象->傅立葉變換->傅立葉逆變換->讀取影象 int main() { cv::Mat img = cv::imread("lena.jpg"); DFTtransform(img);

opencv實現影象的變換

本文是在別人部落格的基礎上做的,具體內容可以參看轉載的部落格,部落格地址:http://blog.csdn.net/qq_34784753/article/details/57129029 #include "opencv2/core/core.hpp" #include

opencv學習實現簡單的影象離散變換

離散傅立葉變換就是將影象從空間域轉換到頻域,這一轉換基本原理為: 任一函式都可以表示成無數個正弦和餘弦函式的和的形式,二維影象的傅立葉變換可用公式表示為: 其中,f是空間域,F是頻域,轉換之後的頻域值是複數,因此顯示傅立葉變換之後的結果需要使用實物影象加虛數影象或者幅度影

快速變換FFT的學習筆記一:C語言程式碼的簡單實現

快速傅立葉變換FFT的學習筆記一:C語言程式碼的簡單實現 fft.c #include "math.h" #include "fft.h" void conjugate_complex(int n,complex in[],complex out[]) { int i = 0

離散變換(DFT)和快速變換(FFT)原理與實現

目錄 1、影象變換 2、離散傅立葉變換(Discrete Fourier Transform) 3、DFT性質 4、DFT與數字影象處理 5、FFT-快速傅立葉變換 6、DFT與FFT的演算法實現 1. 影象變換 — —數學領域中有很多種變換,如傅立葉變換、拉普拉斯變

使用Apache commons-maths3-3.6.1.jar包實現快速變換(java)

    快速傅立葉變換 (fast Fourier transform), 即利用計算機計算離散傅立葉變換(DFT)的高效、快速計算方法的統稱,簡稱FFT。   1 package com; 2 3 import org.apache.commons.math3

0022-在OpenCV環境下做影象或矩陣的變換

傅立葉變換的概念在《高等數學》、《訊號與系統》、《數字訊號處理》中都有詳細的原理說明,網上也有一大堆文章解釋其原理。這裡我就不多說了,總之它是把訊號變換到三角函式系裡,實際上是域的變換,至於變換有什麼好處,其實就是從另一個角度觀察同一個訊號。對影象的傅立葉變換實際上是一個二維傅立葉變換。OpenCV

離散時間變換Matlab實現

一、程式碼實現  %%離散時間傅立葉變換DTFT %若x(t)=cos(2*pi*t),取樣時間為0.1s,得到一個32的有限序列,利用matlab計算他的DFT並畫出影象; clear; ts=0

【演算法】快速變換(FFT)的遞迴實現

FFT是數字訊號處理中的重要演算法,在matlab中可以直接呼叫fft()函式,本文是C++版的FFT演算法,用遞迴方式進行實現。 //================================== //Signal_Process_FFT_v1.cpp //====

【 MATLAB 】用 MATLAB 實現離散時間變換(DTFT)的兩個案例分析

先給出離散時間傅立葉變換的簡單介紹: 如果 x(n) 是絕對可加的,即 那麼它的離散時間傅立葉變換給出為: w 稱為數字頻率,單位是每樣本 rad(弧度)或 (弧度/樣本)(rad/sam

opencv 變換及其逆變換例項及其理解

傅立葉變換是把影象從空間域轉化到頻率域的變換。 空間域 一般的情況下,空間域的影象是f(x,y)=灰度級(0-255),形象一點就是一個二維矩陣,每個座標對應一個顏色值。 頻率域 先介紹幾個概念 頻率:對於影象來說可以指影象顏色值的梯度,即灰度級的變化速度 幅度:可以簡單的理

OpenCV中對影象進行二維離散變換

#include<opencv2/opencv.hpp> #include <highgui.h> #include <iostream> #include <cv.h> #include <opencv2/core/c