当前位置:网站首页>opencv学习-傅里叶变换体会及行方向傅里叶变换代码
opencv学习-傅里叶变换体会及行方向傅里叶变换代码
2022-07-19 10:47:00 【体力劳动替代】
傅里叶变换难理解,做了个实验理解傅里叶变换。
具体过程如下:
1)建一个Mat,对于是按照固定频率 横向(沿行)正弦变化图像。
# include <opencv2/core/core.hpp>
# include <opencv2/highgui/highgui.hpp>
# include <opencv2/imgproc/imgproc.hpp>
#include <iostream>
#include "math.h"
using namespace cv;
using namespace std;
//构造 一副 黑白间隔图像。灰度值按照正弦规律,以列数为输入变量。
cv::Mat blackWhiteTrip = cv::Mat::zeros(96,256,CV_8UC1);
for( int j =0;j< blackWhiteTrip.rows;j++)
{
for(int i=0;i<blackWhiteTrip.cols;i++)
{
double theta;
theta =3.1415926;
theta = theta*2*i/ blackWhiteTrip.cols*16;
theta = sin(theta)/2*255+128;
blackWhiteTrip.at<uchar>(j,i)= uchar(theta);
}
}
imshow("blackWhiteTrip", blackWhiteTrip);
结果图:
2)调用OPENCV的函数 cv::dft(…),可以逐行(对应一维数组)做傅里叶变换。
cv::Mat DFT_1D(cv::Mat srcImage)//输入灰度值Mat,计算傅里叶变换 幅值对数值
{
cv::Mat SignalMat;
srcImage.copyTo(SignalMat);
// 为傅立叶变换的结果(实部和虚部)分配存储空间
cv::Mat planes[] = {
cv::Mat_<float>(SignalMat),
cv::Mat::zeros(SignalMat.size(), CV_32F)};
Mat completeI;
// 为延扩后的图像增添一个初始化为0的通道
merge(planes,2,completeI);
// 进行离散傅立叶变换
dft(completeI,completeI);
// 将复数转换为幅度
split(completeI,planes);
cv::magnitude(planes[0],planes[1],planes[0]);//计算复数的向量值(幅值)
cv::Mat dftResultImage = planes[0]; //幅值
// 对数尺度(logarithmic scale)缩放
dftResultImage += 1;
log(dftResultImage,dftResultImage);
//cout<<dftResultImage;
return dftResultImage;
}
3)将输入图像转为灰度图,逐行做傅里叶变换。
cv::Mat srcGray;
//cvtColor(srcImage,srcGray,CV_RGB2GRAY);
blackWhiteTrip.copyTo(srcGray);// 第一步 代码产生的特殊图像
//srcGray = srcGray.t();// 矩阵转置操作
imshow("srcImage", srcGray);
static int channels = srcGray.channels();
static int types = srcGray.type();
//数组转Mat
cv::Mat resultImg = cv::Mat::zeros(srcGray.rows,srcGray.cols, CV_32FC1) ;//放傅里叶幅值结果
for(int i = 0;i<srcGray.rows;i++)
{
// 提取1维向量作 傅里叶变换
cv::Mat SM = cv::Mat::zeros(1,srcGray.cols, CV_8UC1) ;//定义一个 行向量
for(int j=0;j<srcGray.cols;j++)
{
SM.at<uchar>(0,j)= srcGray.at<uchar>(i,j);//取行向量
}
cv::Mat tempImage;
tempImage = DFT_1D( SM);//该行向量做傅里叶变换,调用第二步函数
for(int j=0;j<srcGray.cols;j++)
{
resultImg.at<float>(i,j) = tempImage.at<float>(0,j);//按行存储 傅里叶变换结果
}
}
cv::normalize(resultImg,resultImg,0,1,CV_MINMAX);// 归一化处理
结果如图:
边栏推荐
- I used Kaitian platform to make a string check API [Kaitian apaas battle]
- onnx 模型导出为 trt 模型
- 鉴源论坛 · 观模丨测试的充分性问题
- Cloud native (36) | introduction and installation of harbor in kubernetes
- How to prevent repeated payment of orders?
- DNSlog平台的搭建
- Thoughts on a decoration contract
- 如何防止订单重复支付?
- 各位大佬,请问怎么把flink sql打印到控制台的结果完全展示呢?
- Experiment 2 rip comprehensive experiment
猜你喜欢
OSPF content
6、微服务架构分析
LiveDataBus核心原来如此简单
【深度】新派LaaS协议Elephant:重振DeFi赛道发展的关键
恒勃控股IPO过会:年营收6.3亿 周书忠家族为实控人
Alibaba hot updates the story of sophix
鉴源论坛 · 观模丨测试的充分性问题
Experiment 2 rip comprehensive experiment
【Latex】PPT画图,导出emf格式,word插入emf文件并导出pdf,pdf裁剪并导出eps文件,latex插入eps文件
Cloud native (36) | introduction and installation of harbor in kubernetes
随机推荐
扎心了!16岁女生被骗3万后不服气又被骗5万
AutoJs学习-实现3D视角
Experiment 1 static comprehensive experiment
Detailed explanation of Android interview hash principle II
Experiment 4 OSPF experiment in mGRE environment
基于STM32的温湿度环境监测系统
SSH 私钥实现登录远程目标服务器
2022年最新上海建筑八大员(标准员)考试试题及答案
Apache Shenyu Admin 身份验证绕过漏洞(CVE-2021-37580)分析与防护手段
在 IDEA 里下个五子棋不过分吧?
I used Kaitian platform to make a string check API [Kaitian apaas battle]
革新求生的读书郎、步步高
Some questions about deploying Ogg microservices
研究:超过70%的医生仍在开具不安全的抗生素药物
雲原生(三十六) | Kubernetes篇之Harbor入門和安裝
反编译APP
YApi安装
Cooperatively Coevolving Particle Swarms forLarge Scale Optimization
OSPF内容
Intel base instruction -- bnd