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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

傅里叶变换频谱的可视化保存

發布時間:2024/7/23 编程问答 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 傅里叶变换频谱的可视化保存 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在上一篇關于傅里葉變換的博客中,知道了imshow的一個小trick:對normalize得到的0~1之間的浮點數構成的矩陣會進行放大255的操作,得到可視化的灰度圖。即便是在python中也是如此操作的,只不過python中的函數封裝得更加嚴密,我們看不到填充、歸一化等操作,當把顯示出的圖像保存到本地時再打開查看,圖像的像素依然在0~1之間,不利于我們之后對于頻譜圖的處理。所以這里就著重研究一下如何將imshow出的圖像原樣地保存下來。

鏈接1提到該函數分為范圍歸一化與數據值歸一化。(Normalizes the norm or value range of an array.),由第三個參數alpha決定,1表示函數用來規范值,2表示規范范圍,并且和第四個參數分別規定了范圍的下限和上限。由此我們可以看到數值歸一化和范圍歸一化的區別:

數值歸一化是利用現有的數據通過某種占比方式重新計算每一個數值的占比作為新的值。

????????????????????????????????????????????????????????????????????????????? ?

根據范數類型norm_type的不同,分母可以是數值之和,對應L1范數;可以是最大值,對應INF范數;可以是數據的平方之和再開根號,對應L2范數。所以數據值歸一化也叫范數歸一化。

范圍的歸一化也叫線性變換(線性拉伸或壓縮),因為范圍變換引入了范圍的上限和下限,根據幾何知識可以進行計算。

??????????????????????????????????????????????????????????????? ?

特別地,當待歸一化的數組最小值是0,且范圍上下限分別是0、1時,范圍歸一化的結果和范數INF歸一化的結果相同。可以按照如下代碼驗證:

#include<opencv2/opencv.hpp> #include<iostream>using namespace std;int main() {vector<double>a = { 10, 11, 234, 45, 65, 456};cv::normalize(a, a, 2, 300, cv::NORM_MINMAX);for (int i = 0; i < a.size(); i++){cout << a[i] << endl;}getchar();return 0; }

為了保證頻譜圖像本身是可視化圖像(灰度值分布在0~255),使用normalize函數:

normalize(mag, mag, 0, 255, CV_MINMAX);//范圍歸一化在0~255,但是顯示出來的是全白圖像。

于是決定手動對數組乘255.實現方式是用OpenCV的函數:

void multiply(InputArray src1, InputArraysrc2,OutputArray dst, doublescale=1, int dtype=-1);

//Mat gainMat(mag.rows, mag.cols, CV_32F, Scalar::all(255));//multiply(gainMat, mag, mag);//multiply要求兩個矩陣類型一樣

但結果是顯示出的頻譜圖依然是全白圖像。注意到浮點數才想起來imshow對浮點數還會進行一次255的乘法操作,所以關鍵其實在把數組由float類型轉換為可視圖像的uchar(8為無符號類型)。同樣利用OpenCV函數:convertTo函數(src.convertTo(dst, type, scale, shift)

mag.convertTo(mag, CV_8U, 1);

其實convertTo函數也可以實現數據的縮放。如果我們用normalize函數范圍變換到0~255,就不必經過數組乘法,在convertTo函數中選擇數據格式為CV_8U,縮放尺度為1,就可以得到我們想要的頻譜圖像。

前文中涉及的multiply函數實現的實際上是矩陣的數乘,兩個參與運算的矩陣行列一致,矩陣每個元素對應相乘,得到依然是同樣大小的數組。這里順便總結一下矩陣的其他乘法。

點乘(內積、數量積)

要求參與運算的兩個矩陣行列一致,但會把矩陣擴展成一個行(列)向量,結果是對應元素的相乘,再相加求和,結果是一個標量(double類型)。

Mul

Mul函數和multiply的功能一樣,但需要注意的是輸出的Mat AB如果沒有聲明類型,默認是和A、B一致的,且若AB精度不夠,可能產生溢出,溢出的值被置為當前精度下的最大值。如AB中第一個元素應該為60*60=360,但AB默認的類型為CV_8UC1,即最大值只能是255

矩陣乘法

OpenCV重載了運算符“*”,實現我們最熟知的矩陣乘法,結果的元素是行列對應元素相乘求和的結果。參與點乘的兩個Mat矩陣的數據類型(type)只能是 CV_32F、 CV_64FC1、 CV_32FC2、 CV_64FC2 這4種類型中的一種。若選用其他類型,比如CV_8UC1,編譯器會報錯。

Reference:

1.??????Normalize:https://blog.csdn.net/cosmispower/article/details/64457406

2.??????https://blog.csdn.net/liyuan123zhouhui/article/details/51745414

3.??????convertTo :https://blog.csdn.net/qq_36355900/article/details/76034805

4.??????點乘、dot、mul:https://blog.csdn.net/dcrmg/article/details/52404580

總結

以上是生活随笔為你收集整理的傅里叶变换频谱的可视化保存的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。