# 1 图像二维频谱长什么样子(左图是原图,右图是对应的频谱图)

(图片来源:第一组是来自matlab自带的图片 “cameraman.tif”;第二组是用 excel 画的,然后截图)

# 2 怎么获得(matlab和C++调用)

  • matlaba代码,保存为 spectrum2D.m
function [Result] = spectrum2D(I)
% I is a gray image
% 'Input Image should be gray!' A = rgb2gray(I);A = I; % A 要是一个灰度图像
F = fftshift(fft2(A)); % fft2() 是快速傅里叶变换函数% fftshift() 目的是为了将图像横纵划分成四块,对角线互换。% 经过变换以后的图像 F 中心是低频,往外频率增大。% 以下的操作是为获得可以显示的图像。
% 如果直接显示 F ,得到的很可能是一个全白的图。
% 原因是,F内像素的值一般都很大,远大于255.
% 而matlab的imshow函数黑白对应0-255,所以不做归一化处理的图像,显示都是白色的。B = abs(real(F)); % F 有可能是负值,而且数据是中心对称的,中心为最亮点(可以参考C++例程中的说明)
[m, n] = size(B); % 获得行数、列数
R = reshape(B, 1, m*n); % 将B映射成1行m*n列的矩阵
Temp = mapminmax(R, 0, 255); % 将R的像素值归一化到0-255之间
Result = reshape(Temp, m, n); % imshow(Result); % 建议调用的时候使用:imshow(spectrum2D(灰度图像矩阵))% imshow(spectrum2D( rgb2gray(RGB图像矩阵)))end

(以上三幅图,分别对应代码中的:A、F、Result)

抱着折腾的心态,我们把matlab的这个函数在opencv里面试着来玩一下~~不感兴趣的可以跳过。

使用opencv来调用matlab的目的在于可以方便的移植,而且方便我们可以数据进行处理;

  比如这后面要做的峰点滤波,使得亮点更加明显。(为什么要这样做呢,那就要理解亮点的含义才可以,接着往下看。)

主要思路:1 使用matlab生成dll;2 在opencv环境中调用dll

  • matlab生成dll
mex -setup
mbuild -setup
# mcc -W cpplib:名字  -T link:lib matlab文件.m
mcc -W cpplib:spectrum2D -T link:lib spectrum2D.m

  • 调用opencv
// Spectrum2D.cpp : 定义控制台应用程序的入口点。
// 配置手顺:
// 1. vs2015(工程属性设置为64bit)+opencv320,64 bit windows,配置好(不懂得话去网上搜吧,很容易)。
// 2. 加载matlab生产的dll、头文件、lib,不需要cpp。(不懂得话,百度搜“怎么加载dll”)
// 3. 上步的头文件应该会提示 mclmcrrt.h mclcppclass.h找不到,这是matlab安装目录下的文件,加载到(属性->VC++ ->包含目录)
// 4. 加载matlab库文件 mclmcrrt.lib mclmcr.lib
//      (属性->VC++ ->库目录)路径:MATLAB2013a\extern\lib\win64\microsoft
//
// 作者:路边的十元钱硬币
// 时间:20170630
// 最后的话,做注释可以的话,最好还是英文,因为vs平台,汉字注释有可能会造成编译错误。
//

#include "stdafx.h"
#include <opencv2\opencv.hpp>
#include "spectrum2D.h"/// mwArray 是matlab用的数据类型,不论是矩阵还是数字,当需要作为参数传递到matlab生产的函数中时,要转化成这种数据类型
/// 使用方法见代码
mwArray Mat2mwArray(cv::Mat src)
{CV_Assert(src.type() == CV_8UC1);mwArray dst(src.rows, src.cols, mxUINT8_CLASS); /// 初始化,可以理解成矩阵cv::Mat src_t = src.t();dst.SetData(src_t.data, src.rows*src.cols); /// 赋值return dst;
}cv::Mat mwArry2Mat(mwArray src, int rows, int cols)
{if(src.IsEmpty()) /// 是否为空return cv::Mat();cv::Mat dst = cv::Mat::zeros(rows, cols, CV_64FC1);for(int j(0); j<rows; ++j){double* pdata = dst.ptr<double>(j);for(int i(0); i<cols; ++i){pdata[i] = src(j+1,i+1); /// 元素访问(行号,列号)
        }}return dst;
}int _tmain(int argc, _TCHAR* argv[])
{cv::Mat src = cv::imread("1.JPG", CV_LOAD_IMAGE_GRAYSCALE);cv::imshow("src", src);/// matlab mwArray 初始化,必须要做,不然报错if( !spectrum2DInitialize()){std::cout << "Could not initialize!" << std::endl;return -1; }mwArray mlImg = Mat2mwArray(src);mwArray mlResult ;spectrum2D(1,mlResult, mlImg);/**简单说下mwArray的用法:mwArray a_int_varible(1, 1, mxINT8_CLASS); /// 定义mwArray a_double_varible(1, 1, mxDOUBLE_CLASS);a_int_varible(1,1) = 10; /// 赋值a_double_varible(1,1) = 10.0;int a = a_int_varible(1,1);**/cv::Mat result = mwArry2Mat(mlResult, src.rows, src.cols);cv::imshow("FFT2", result);cv::waitKey(0);return 0;
}

设置断点可以查看result矩阵中的数值。

vs需要安装插件 Image Watch

原图是#1中的第二组图,这是其对应频谱的中心亮点的局部放大图。其中255是中心亮点,6.8616是次亮点,注意左右是对称的。

规律一:中心是最大亮点

规律二:次亮点6.8616到255的距离是6,正好等于#1第二组图黑白条纹的重复次数。这不是巧合。

# 3 图的含义

  • 先看黑白条纹的图,把图像想象成波浪,将像素点值当成起伏高度,于是获得一个水平往右(往左也无所谓)传播的“黑色波浪”。
  • 在一维中,一条曲线可以被表示成很多不同频率的sin或者cos的叠加。(要问为什么的话,百度搜搜傅里叶变换相关的东西。)注意,这里的sin或者cos是二维波,只是线(y=sin(x)的图像)

  • 类似的,在图像中,每个“波浪”也可以被表示成很多不同频率的sin或者cos的叠加。注意,这里的sin或者cos函数是三维波,是曲面(y=sin(x),z=任意数)(波浪)

  • 想象一幅拥有最大频率波浪的图应该是什么样的,看图。

是不是应该到最后,黑或者白条纹的宽度=1个像素?对的。这就是一幅图频率的极限。

所以,得到重要结论:

  • 频谱图的中心亮点,是0频率点。往外,频率增大;同一圆周上的点,频率相同。
  • 频谱图的x轴的最右边点(无论是不是亮点),表示图像水平方向上的最大频率(波长是2个像素)。
  • 频谱图的任意点A到中心点O的距离|OA|表示频率。

  大家应该是有疑惑的,就是这里的关于“频率”的理解。这里说到的“频率”,可以理解成条纹出现的次数,看下图说明。

    上图蓝色的为频谱图区域。其上的点A到中心点O的距离|AO|(单位像素),表示波的频率w=|OA|;其A点的像素值,表示图像中该方向(矢量OA的方向)上,频率为|AO|的比重(这里说比重而不说数量,因为频谱图的点的像素值只是响应值,只能用于对比多少。而且一般需要归一化。谈相差比例才有意义)

  • 总结:

频谱图上任意点A,中心点O,A点像素值PA

A点的含义是:原图像上,(矢量OA)方向上的,频率为|OA|的平面波的“比重”是PA。

# 4 图的作用

|OA| = 对应A点的波浪在原图上出现的次数。

滤去某些噪声等。

能力有限,错误或不全之处请不吝赐教。

路边的十元钱硬币

end.

转载于:https://www.cnblogs.com/alexYuin/p/7067381.html

图像的二维频谱图的理解 20170622相关推荐

  1. avframe转byte数组_C# amp; VB6.0 图像与二维数组 互转

    背景 最近在研究C#进行图像处理,在图像处理中算法中,往往都是针对的是矩阵运算的.矩阵其实就是一个二维的数组. 为了图像处理的速度,我们都需要放在内存中处理.但网络上收集的代码,往往都是以一维数组的样 ...

  2. 对图像进行二维离散Fourier变换

    用函数fft2对图像进行二维离散Fourier变换.用图像的形式分别显示清晰的频谱幅度和相位.对图像用窗函数加权,观察其Fourier变换,解释加窗前后的变化.对图像作Fourier变换和反变换.将图 ...

  3. (三)matplotlib3.0画三维图(二维热图)

    教程示例 """ matplotlib3.0三维图 mayuhua 2020.5.17 """from mpl_toolkits impor ...

  4. matlab 把图像变成二维的,matlab图像怎么变成二维矩阵

    求:matlab二维直方图图像分割程序.. 我给你个网站``里面的教学很详细~~希望能帮到你~~~~反正里面的软件教程很多``就是不知道有没你要找的``如果有~~给我加分哈``http://tech. ...

  5. 使用matlab对图像进行二维傅里叶变换

    这学期选了<图像工程基础>这门课,课上老师留了一个作业:对图像进行二维傅里叶变换. 现在我使用matlab解决这个问题 1.实验基本指令 首先我试了一下matlab图像处理的基本指令 原图 ...

  6. ITK系列24_ 区域增长(孤立连接)算法对脑部PNG图像进行二维分割

    孤立连接 接 下 来 的 例 子 阐 述 了 itk::IsolatedConnectedImageFilter 的 用 法 . 这 个 滤 波 器 是itk::ConnectedThresholdI ...

  7. 可完全分离的二维矢量图加密域鲁棒可逆水印算法(一)

    摘要 随着云制造技术的兴起,加密域可逆水印技术逐渐受到了较多的关注.然而,现有的大部分算法不仅只能应用于图像.视频等冗余性较大的载体,而且难以抵御常见的攻击,甚至只能在单一的域中提取水印.为此,本文针 ...

  8. R语言绘制二维密度图

    R语言绘制二维密度图 二维密度图显示了两个数值变量之间的关系,一个在x轴上表示,另一个在Y轴上表示,与散点图类似,然后计算二维空间中特定区域内的观测数,并用颜色梯度表示.二维密度图有几种类型,以下主要 ...

  9. R语言ggplot2可视化2d密度图:可视化二维密度图并将两个二维密度图重叠起来、Overlay two ggplot2 stat_density2d plots

    R语言ggplot2可视化2D密度图:可视化二维密度图并将两个二维密度图重叠起来.Overlay two ggplot2 stat_density2d plots 目录

最新文章

  1. POJ-1041 John's trip
  2. Python 之字符串常用方法
  3. simulink中mask设置_(实现BPSK学习Verilog)1. Simulink仿真实现
  4. javascript 执行效率 java_有效提高JavaScript执行效率的几点知识
  5. Pazera Free MP4 To MP3 Converter 1.6 中文64位+32位便携版,免费的视频转换器
  6. 论文笔记:《DeblurGAN: Blind Motion Deblurring Using Conditional Adversarial Networks》
  7. phaser H5游戏框架的学习相关推荐教程
  8. golang dep安装
  9. 入了giant FCR 3100,纪念一下!¥1800元
  10. Spire.doc实现对word的操作(包括文字,表格,图片)
  11. 语音控制小车运动APP(基于百度语音识别)
  12. 公职人员财产公开_知道您的财产:Web设计人员/开发人员的薪资指南[比较]
  13. 机器学习数据划分笔记(train_test_split)
  14. getDate方法的妙用(js判断闰年)
  15. 师范生计算机软件技能怎么写,计算机与信息科学学院 软件学院第十三届 师范生课堂教学技能竞赛...
  16. 美容美发店会员管理系统开发_分享美容美发店做会员管理系统的好处
  17. 工业视觉引导基础及项目评估流程
  18. opencv中cvtcolor()函数用法总结(07)
  19. FTP服务器安装和搭建
  20. 如何将windows安装在移动硬盘上

热门文章

  1. 重力感应失灵/更新win10后不能自动旋转屏幕
  2. C语言:习题4-5 换硬币 (20分)
  3. android实现首页倒计时,Android倒计时 Android仿京东倒计时 android电商app源码倒计时源码...
  4. JDK8之ConcurrentHashMap源码解读
  5. VM16Pro安装win7
  6. 使用Bind提供域名解析服务
  7. IOS 最右 注册 登录协议分析记录
  8. css参考手册css3手册_CSS手册:面向开发人员CSS便捷指南
  9. 数据分析真题日刷 | 网易2018校招数据分析师笔试卷
  10. 国二c语言考试要点,全国计算机二级考试c语言考试要点