返利网站做鹊桥推广,成都 网站建设,宁波外贸网站设计公司,国外网站设计的网站在上一篇关于傅里叶变换的博客中#xff0c;知道了imshow的一个小trick#xff1a;对normalize得到的0~1之间的浮点数构成的矩阵会进行放大255的操作#xff0c;得到可视化的灰度图。即便是在python中也是如此操作的#xff0c;只不过python中的函数封装得更加严密#xf…在上一篇关于傅里叶变换的博客中知道了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归一化的结果相同。可以按照如下代码验证
#includeopencv2/opencv.hpp
#includeiostreamusing namespace std;int main()
{vectordoublea { 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, doublescale1, int dtype-1);
//Mat gainMat(mag.rows, mag.cols, CV_32F, Scalar::all(255));//multiply(gainMat, mag, mag);//multiply要求两个矩阵类型一样
但结果是显示出的频谱图依然是全白图像。注意到浮点数才想起来imshow对浮点数还会进行一次255的乘法操作所以关键其实在把数组由float类型转换为可视图像的uchar8为无符号类型。同样利用OpenCV函数convertTo函数src.convertTo(dst, type, scale, shiftmag.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*60360但AB默认的类型为CV_8UC1,即最大值只能是255
矩阵乘法
OpenCV重载了运算符“*”实现我们最熟知的矩阵乘法结果的元素是行列对应元素相乘求和的结果。参与点乘的两个Mat矩阵的数据类型type只能是 CV_32F、 CV_64FC1、 CV_32FC2、 CV_64FC2 这4种类型中的一种。若选用其他类型比如CV_8UC1编译器会报错。
Reference
1. Normalizehttps://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、mulhttps://blog.csdn.net/dcrmg/article/details/52404580