日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

OpenCV3.0中的离散傅里叶变换

發(fā)布時間:2025/3/20 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 OpenCV3.0中的离散傅里叶变换 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

圖像中的離散傅里葉變換的相關(guān)理論較為簡單,頻域里面,對于一幅圖像,高頻部分代表了圖像的細(xì)節(jié)、紋理信息;低頻部分代表了圖像的輪廓信息。
這里我們直接講解OpenCV3.0中的離散傅里葉變換
1.dft()函數(shù)詳解
dft()函數(shù)的作用是對一維或者二維浮點數(shù)組進(jìn)行正向或反向離散傅里葉變換。
C++:void dft(InputArray src,OutputArray dst,int flags = 0,int nonzerRows = 0)
參數(shù)一:InputArray類型的src,輸入矩陣,可以為實數(shù)或者虛數(shù)
參數(shù)二:OutputArray類型的dst,函數(shù)調(diào)用后的運算結(jié)果存在這里,其尺寸和類型取決于標(biāo)識符,也就是第三個參數(shù)flags
參數(shù)三:int 類型的flags,轉(zhuǎn)換的標(biāo)識符,有默認(rèn)值為0,取值為下表:

參數(shù)四:int 類型的nonzeroRows,有默認(rèn)值0,當(dāng)此參數(shù)設(shè)置為非0,函數(shù)會假設(shè)只有輸入的第一個非零行包含非零元素(沒有設(shè)置DFT_INVERSE)或只有輸出矩陣的第一個非零行包含非零元素(設(shè)置了DFT_INVERSE標(biāo)識符)。
2.返回DFT最優(yōu)尺寸大小:getOptimalDFTSize()函數(shù)
getOptimalDFTSize()函數(shù)返回給定尺寸的傅里葉最優(yōu)尺寸大小。為了提高離散傅里葉變換的運行速度,需要擴(kuò)充圖像,而具體擴(kuò)充多少,就由函數(shù)來計算得到
C++:int getOptimalDFTSize(int vecsize)
參數(shù)vecsize,向量尺寸,即圖片的rows,cols
3.擴(kuò)充邊界:copyMakeBorder()函數(shù)
copyMakeBorder()函數(shù)的作用是擴(kuò)充圖像邊界
C++:void copyMakeBorder(InputArray src,OutputArray dst,int top,int bottom,int left,int right,int borderType,const Scalar& value = Scalar())
參數(shù)一:同上
參數(shù)二:函數(shù)調(diào)用后的結(jié)果存放在這里,需要和源圖片有一樣的尺寸和類型,且size應(yīng)該為Size(src.cols+left+right,src.rows+top+bottom)
接下來的四個參數(shù)top,bottom,left,right,分別表示在源圖像的四個方向上擴(kuò)充多少像素,例如top = 2,bottom = 2,left = 2,right = 2就意味著在源圖像的上下左右各擴(kuò)充兩個像素寬度的邊界
參數(shù)七:borderType類型的,邊界類型,常見的取值為BORDER_CONSTANT
參數(shù)八:有默認(rèn)的Scalar(),可以理解為有默認(rèn)值0,當(dāng)borderType取值為BORDER_CONSTANT時,這個參數(shù)表示邊界值
4.計算二維矢量的幅值:magnitude()函數(shù)
C++:void magnitude(InputArray x,InputArray y,OutputArray magnitude)
參數(shù)一:表示矢量浮點型X坐標(biāo)值,也就是實部
參數(shù)二:表示矢量浮點型Y坐標(biāo)值,也就是虛部
參數(shù)三:輸出的幅值,塔河第一個參數(shù)X有著相同的尺寸和類型
5.計算自然對數(shù):log()函數(shù)
C++:void log(InputArray src,OutputArray dst)
參數(shù)一:輸入圖像
參數(shù)二:得到的對數(shù)值
6.矩陣歸一化:normalize()函數(shù)
C++:void normalize(InputArray src,OutArray dst,double alpha = 1,double beta = 0,int norm_type = NORM_L2,int dtype = -1,InputArray mask = noArray())
參數(shù)一:輸入圖像,填Mat類的對象即可
參數(shù)二:輸出圖像,和輸入圖像有一樣的尺寸和類型
參數(shù)三:歸一化后的最大值,有默認(rèn)值1
參數(shù)四:歸一化后的最大值,有默認(rèn)值0
參數(shù)五:歸一化類型,有NORMAL_INF,NORMAL_L1,NORMAL_L2,和NORMAL_MINMAX等參數(shù)可選,默認(rèn)值是NORM_L2,、
參數(shù)六:有默認(rèn)值-1,當(dāng)此參數(shù)取值為復(fù)數(shù)時,輸出矩陣和src有相同的類型,否則和src有同樣的通道數(shù),且此時圖像深度為CV_MAT_DEPTH(dtype)
參數(shù)七:可選的操作掩膜,有默認(rèn)值noArray()
下面通過代碼詳細(xì)講解(使用的是OpenCV3.0+VS2010):

關(guān)于包含.hpp,其實質(zhì)就是將.cpp的實現(xiàn)代碼混入.h頭文件當(dāng)中,定義與實現(xiàn)都包含在同一文件,則該類的調(diào)用者只需要include該。hpp文件即可,無需再 將cpp加入到project中進(jìn)行編譯
另外關(guān)于常用的幾個頭文件:
1.core.hpp
【core】–核心功能模塊,包含以下內(nèi)容:
OpenCV基本數(shù)據(jù)結(jié)構(gòu)
動態(tài)數(shù)據(jù)結(jié)構(gòu)
繪圖函數(shù)
數(shù)組操作相關(guān)函數(shù)
輔助功能與系統(tǒng)函數(shù)和宏
與OpenGL的互操作
2.improc.hpp
【improc】–Image和Process這兩個單詞的縮寫組合,圖像處理模塊,包含:
線性和非線性的圖像濾波
圖像的幾何變換
其他(Miscellaneous)圖像轉(zhuǎn)換
直方圖相關(guān)
結(jié)構(gòu)分析和形狀描述
運動分析和對象跟蹤
特征檢測
目標(biāo)檢測等內(nèi)容
3.highgui.hpp
【highgui】–高層GUI圖形用戶界面,包含媒體的輸入輸出、視頻捕捉、圖像和視頻的編碼解碼、圖像交互界面的借口等內(nèi)容

// DFT.cpp : 定義控制臺應(yīng)用程序的入口點。 //#include "stdafx.h" #include "stdafx.h" #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <iostream>using namespace std; using namespace cv;int _tmain(int argc, _TCHAR* argv[]) {//以灰度圖像模式讀入原始圖像Mat srcImage = imread("1.jpg",0);if(!srcImage.data){printf("圖像讀入失敗!\n");return false;}imshow("原始圖像",srcImage);//將圖像擴(kuò)展到最佳尺寸,邊界用0補充int m = getOptimalDFTSize(srcImage.rows);int n = getOptimalDFTSize(srcImage.cols);//將添加的像素初始化為0Mat padded;copyMakeBorder(srcImage,padded,0,m-srcImage.rows,0,n-srcImage.cols,BORDER_CONSTANT,Scalar::all(0));//為傅里葉變換的結(jié)果(實部和虛部)分配存儲空間//將planes數(shù)組組合合并成一個多通道的數(shù)組complexIMat planes[] = {Mat_<float>(padded),Mat::zeros(padded.size(),CV_32F)};Mat complexI;merge(planes,2,complexI);//進(jìn)行傅里葉變換dft(complexI,complexI);//將復(fù)數(shù)轉(zhuǎn)換為幅值,即=> log(1 + sqrt(Re(DFT(I))^2 + Im(DFT(I))^2))split(complexI, planes); // 將多通道數(shù)組complexI分離成幾個單通道數(shù)組,planes[0] = Re(DFT(I), planes[1] = Im(DFT(I))magnitude(planes[0], planes[1], planes[0]);// planes[0] = magnitude Mat magnitudeImage = planes[0];//進(jìn)行對數(shù)尺度縮放magnitudeImage += Scalar::all(1);log(magnitudeImage,magnitudeImage);//求自然對數(shù)//剪切和充分不幅度圖象限//若有奇數(shù)行或者奇數(shù)列,進(jìn)行頻譜裁剪magnitudeImage = magnitudeImage(Rect(0,0,magnitudeImage.cols &-2,magnitudeImage.rows & -2));//重新排列傅里葉圖像中的象限,使得原點位于圖像的中心int cx = magnitudeImage.cols / 2;int cy = magnitudeImage.rows / 2;Mat q0(magnitudeImage,Rect(0,0,cx,cy));//ROI區(qū)域的左上Mat q1(magnitudeImage,Rect(cx,0,cx,cy));//ROI區(qū)域的右上Mat q2(magnitudeImage,Rect(0,cy,cx,cy));//ROI區(qū)域的左下Mat q3(magnitudeImage,Rect(cx,cy,cx,cy));//ROI區(qū)域的右下//交換象限(左上與右下)Mat tmp;q0.copyTo(tmp);q3.copyTo(q0);tmp.copyTo(q3);//交換象限(右上與左下)q1.copyTo(tmp);q2.copyTo(q1);tmp.copyTo(q2);//歸一化normalize(magnitudeImage,magnitudeImage,0,1,CV_MINMAX);//顯示imshow("頻譜幅值",magnitudeImage);waitKey();return 0; }

下面為源圖像和頻譜圖像

總結(jié)

以上是生活随笔為你收集整理的OpenCV3.0中的离散傅里叶变换的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。