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

在上一篇关于傅里叶变换的博客中,知道了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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/493679.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

她取代马斯克成特斯拉新董事长 究竟什么来头?

来源&#xff1a;智车科技摘要&#xff1a;就如乔布斯之于苹果&#xff0c;对很多人来说&#xff0c;马斯克对特斯拉而言也有非凡的意义。甚至可以说&#xff0c;特斯拉的品牌吸引力很大程度上来自于“钢铁侠”本人。但由于当初任性发布“私有化”消息&#xff0c;被美国证交会…

十二天深入理解计算机系统(一)

计算机系统漫游 1 信息就是位上下文 系统中所有的信息都是由一串位表示的&#xff0c;在不同的上下文中&#xff0c;一个同样的字节序列可能表示一个整数、浮点数、字符串或者机器指令。 2 文本文件和二进制文件 有ASCII字符构成的文件称为文本文件&#xff0c;所有其他文件都是…

李航《统计学习方法》-----朴素贝叶斯

朴素贝叶斯法nave Bayes&#xff0c;在nave的中间字母上其实有两个点&#xff0c;查了一下才发现是法语中的分音符&#xff0c;在发音过程中发挥作用。但这不是重要的&#xff0c;重要的是在这种学习方法中贝叶斯承担了什么样的角色。 首先简单证明一下贝叶斯公式。联合概率Joi…

IEEE专访李开复:人类已打开潘多拉盒子,封堵AI变革只会徒劳

来源&#xff1a;《IEEE Spectrum》摘要&#xff1a;近期&#xff0c;李开复新书《AI未来》在美国同样反响不俗。在荣登多个排行榜后&#xff0c;IEEE旗下《IEEE Spectrum》&#xff0c;对李开复进行了专访&#xff0c;谈到了众多当前AI领域最受关注的话题。而且从《IEEE Spect…

Rand函数使用和对补码的理解

下面是在牛客网看到的一道题; //假设这n个数的序号依次为0,1,2,...,n-1,数组名为num void knuth1(int* pNum, int m, int n){srand((unsigned int)time(0));for (int i0; i<n; i){if (rand()%(n-i) < m)//rand()%(n-i)的取值范围是[0, n-i&#xff09;{cout << p…

深度学习巨头Yoshua Bengio清华演讲: 深度学习通往人类水平人工智能的挑战

来源&#xff1a;专知摘要&#xff1a;2018年11月7日晚&#xff0c;被称为“深度学习三巨头”之一的蒙特利尔大学计算机科学与运算研究系教授Yoshua Bengio在清华大学做了《深度学习抵达人类水平人工智能所面临的挑战&#xff08;Challenges for Deep Learning towards Human-L…

了解GAN网络

GAN网络&#xff0c;第一次听说它就不明觉厉。其他网络都是对输入图像进行某种处理&#xff0c;得到某种特定的输出。而GAN网络居然可以“无中生有”&#xff0c;无论是去除马赛克&#xff0c;还是换脸&#xff0c;还是对灰度图像上色&#xff0c;都显得不可思议&#xff0c;怎…

新能源汽车:大变革催生十万亿市场空间

来源&#xff1a;新时代证券&#xff08;开文明&#xff09;新能源汽车发展空间巨大&#xff0c;随着新能源汽车性能提升以及痛点的改善&#xff0c;新能源汽车带来的冲击越来越大&#xff0c;渗透率随之提升。根据BNEF预测&#xff0c;到2025年全球新能源汽车的销量将达到1100…

dlib+vs2013+opencv实现人脸特征点检测

刷知乎的时候发现dlib做特征点检测和人脸识别的效果都好于OpenCV&#xff0c;就想着动手玩一下。没想到也是遇坑重重。 首先&#xff0c;在官网 install命令和setup.py文件进行安装时报错&#xff0c;先是报错cmake没有找到&#xff0c;添加了环境变量之后仍然报错c11需要在vs…

对号入座,看看未来几年机器人是否会取代你的工作

来源&#xff1a;资本实验室摘要&#xff1a;面对未来&#xff0c;你是否准备好了&#xff1f;“机器是否会取代人类的工作”是当前讨论最多的话题之一。这主要源自于近几年以人工智能为代表的新技术的快速发展与商业化。尽管各研究机构的预测数据有所不同&#xff0c;但相同的…

冈萨雷斯《数字图像处理》读书笔记(十一)——表示和描述

虽然不是专门研究图像分割的&#xff08;峰兄才是&#xff09;&#xff0c;但多少接触了一点&#xff0c;并且图像分割是图像处理中的最为复杂的&#xff0c;通过图像分割可以很好地认识图像处理的好多方法。今天看的是边界追踪和链码的表示。网易计算机视觉工程师的第一道选择…

细胞内钾多钠少——原初生物的第三大遗迹?

来源&#xff1a;科学网在我们每日的饮食中&#xff0c;食盐&#xff08;氯化钠&#xff09;是少不了的&#xff0c;难以想象我们怎么能够每天吃完全没有盐味的食物。不仅人类如此&#xff0c;许多动物&#xff0c;例如食草的动物如牛和羊&#xff0c;也会主动寻找土表盐粒。我…

冈萨雷斯《数字图像处理》读书笔记(九)——形态学图像处理

形态学来自于生物学&#xff0c;研究动植物的形态和结构。运用在图像中可提取如边界、骨架和凸壳。初学形态学都是在二值化的图像上研究&#xff0c;之后可以扩展到灰度图像。 膨胀和腐蚀 数学形态学与集合论分不开&#xff0c;因为形态学中的操作是基于两个集合的&#xff0…

云计算行业现状及未来发展趋势

来源&#xff1a;国元证券、乐晴智库摘要&#xff1a;按照服务类型云计算被分为IaaS、PaaS、SaaS。▌云计算产业链构成按照服务类型云计算被分为IaaS、PaaS、SaaS。IaaS基础设施及服务:IaaS主要提供计算基础设施服务&#xff0c;主要包括CPU、内存、存储、网络、虚拟化软件、分…

冈萨雷斯《数字图像处理》读书笔记(三)——空间滤波

滤波这个词来源于频域处理&#xff0c;因为它的目的就是针对频率分量而言的&#xff0c;滤除一定的频率分量。但其实滤波在时域&#xff08;图像中对应为空域&#xff09;中也可以完成相应的操作&#xff0c;比如低通滤波器滤除了代表细节的高频分量&#xff0c;我们可以直接在…

WinInet:HTTPS 请求出现无效的证书颁发机构的处理

首先&#xff0c;微软提供的WinInet库封装了对网页访问的方法。 最近工作需要从https服务器获取数据&#xff0c;都知道https和http网页的访问方式不同&#xff0c;多了一道证书认证程序&#xff0c;这样就使得https在请求起来比http要复杂的多&#xff1b;好在&#xff0c;Win…

热度下的冷思考——智能眼镜到底有没有前途?

来源&#xff1a;环球网我们曾期望Google眼镜能够成为革命性的新产品&#xff0c;因为它某种程度上实现了大家对未来的幻想。然而Google眼镜作为概念产品虽然有趣&#xff0c;但它仍然太不成熟&#xff0c;而且因为存在侵犯隐私的可能还被大众抵触&#xff0c;更重要的是它花去…

TFRecords文件的存储与读取

将cats和dogs两个文件夹各1000张图片存储为&#xff1a;train.tfrecords#将图片文件生成train record import os import tensorflow as tf from PIL import Image #生成cats和dogs的record文件 path./data/train filenamesos.listdir(path) writertf.python_io.TFRecordWriter(…

对比激光SLAM与视觉SLAM:谁会成为未来主流趋势?

来源&#xff1a;智车科技摘要&#xff1a;SLAM&#xff08;同步定位与地图构建&#xff09;&#xff0c;是指运动物体根据传感器的信息&#xff0c;一边计算自身位置&#xff0c;一边构建环境地图的过程&#xff0c;解决机器人等在未知环境下运动时的定位与地图构建问题。目前…

链表中的指针

中期答辩改在了国庆之后&#xff0c;终于有时间可以看看剑指offer了。在看到单向链表的部分&#xff0c;对指针&#xff0c;尤其是头指针有点疑惑。首先容易理解的是链表的节点是一个结构体&#xff0c;该结构体包含一个数据&#xff08;一般是int型&#xff09;&#xff0c;还…