图像的傅立叶变换
信息光学中的傅里叶变换

为了克服这些局限性,未来的研究将更加注重发展新型的 光学器件和技术,如光子晶体、超表面和量子光学等。这 些新技术有望为傅里叶光学的发展带来新的突破和机遇, 推动光学领域的技术进步和应用拓展。同时,随着人工智 能和机器学习等领域的快速发展,将人工智能算法与傅里 叶光学相结合,有望实现更高效、智能的光波信号处理和 分析。
信息光学中的傅里叶变换
目录
• 傅里叶变换基础 • 信息光学基础 • 信息光学中的傅里叶变换 • 傅里叶变换在信息光学中的应用
实例 • 傅里叶变换的数学工具和软件包
01
傅里叶变换基础
傅里叶变换的定义
傅里叶变换是一种数学工具,用于将 一个信号或函数从时间域或空间域转 换到频率域。在信息光学中,傅里叶 变换被广泛应用于图像处理和通信系 统的 编程语言,具有广泛的应 用领域。
R语言是一种统计计算语 言,广泛应用于数据分析 和可视化。
ABCD
C的开源科学计算软件包 如FFTW等可用于计算傅 里叶变换,并支持并行计 算以提高效率。
R语言的科学计算库如 fftw等可用于计算傅里叶 变换,并支持多种数据类 型和可视化方式。
光的波动理论
光的波动理论认为光是一种波动现象,具有波长、频率、相 位等特征,能够发生干涉、衍射等现象。
光的波动理论在光学领域中具有基础性地位,是研究光的行 为和性质的重要工具。
光的量子理论
光的量子理论认为光是由粒子组成的,这些粒子被称为光子。该理论解释了光的 能量、动量和角动量等物理量的本质。
光的量子理论在量子力学和量子光学等领域中具有重要应用,为现代光学技术的 发展提供了理论基础。
04
傅里叶变换在信息光学中的 应用实例
图像处理中的傅里叶变换
图像去噪
傅里叶变换实验报告

傅里叶变换实验报告
一、首先将遥感图像从空间域转换到频率域,把RGB彩色图像转成一系列不同频率的二维正弦波傅里叶图像;
二、然后,在频率域对傅里叶图像进行滤波、掩膜等各种编辑,减少或消除部分高频成份或低频成份;
三、最后,再把频率域的傅里叶图像变换到RGB彩色空间域,得到经过处理的彩色图像,傅里叶变换主要用于消除周期性噪声。
操作步骤:
打开傅里叶变换图像——滤波——保存傅里叶处理图像——傅里叶逆变换
把输入的空间域彩色图像转换成频率域傅里叶图像
如:图一
图一
输入图像表示对1~7波段都处理
打开fourier transform edior 输入处理图像,再打开的图像中只能输入
处理一个波段
选择波段输入显示,低通滤波:ideal 80 增益1,高通:Hanning 200 增益1
傅里叶图像中有分散分布的亮点,应用圆形掩膜可以去除。
首先应用鼠标查询亮点分布坐标,然后启动圆形掩膜功能,设置相应的参数据处理。
低通滤波,去除地物噪声,斑点等,若50不适合,Edit-undo可撤销重做,直到得到合适的半径,点Eile-save as保存
条带处理后
去条带等,还可在mask――wedgemask中设置该楔形的角度及偏角,每个波段都逐一进行条带、噪音等处理后进行各波段融合
去噪之后融合结果对比。
halcon 傅里叶变换进行空域和频段的转换

傅里叶变换及其反变换实现了图像在空间域和频域中的相互转换。
在图像处理中,傅里叶变换被广泛应用于图像增强、图像去噪、图像压缩等领域。
傅里叶变换的基本原理是将图像从空间域转换到频域。
在空间域中,图像表示为像素的强度和位置,而在频域中,图像表示为不同频率分量的幅度和相位。
通过傅里叶变换,可以将图像从空间域中的实部和虚部转换为频域中的正弦和余弦函数。
具体来说,傅里叶变换将图像的每个像素表示为一个复数,该复数包含实部和虚部。
通过将每个像素的实部和虚部乘以不同的权重,然后将它们相加,可以得到该像素在频域中的值。
这个值对应于特定频率下的幅度或相位。
在频域中,每个频率分量都对应于空间域中的一个方向。
例如,水平方向对应于0频率分量,垂直方向对应于π/2频率分量,对角线方向对应于π频率分量。
因此,在频域中处理图像可以更容易地突出某些特征,例如边缘和纹理。
傅里叶变换的逆变换是将频域中的幅度和相位转换回空间域中的像素值。
通过将每个频率分量的幅度和相位乘以不同的权重,然后将它们相加,可以得到空间域中的像素值。
这个值对应于原始图像中
的一个像素。
总之,傅里叶变换是一种重要的图像处理工具,可以将图像从空间域转换到频域,也可以将图像从频域转换回空间域。
这种转换有助于进行图像增强、去噪、压缩等操作。
二维傅里叶变换低频

二维傅里叶变换低频部分指的是图像中的低频成分,通常表现为图像中的平滑区域。
在二维傅里叶变换中,低频成分对应于中心位置附近的频率分量,而高频成分对应于远离中心位置的频率分量。
低频成分代表图像中的整体和缓慢变化的部分,而高频成分代表图像中的细节和突变部分。
通过二维傅里叶变换,可以将图像从空间域转换到频率域,以便更好地分析和处理图像。
在频率域中,可以对图像进行各种滤波、增强和降噪等操作,以改善图像质量或提取图像特征。
低频部分在频率域中具有较大的幅值,通常对应于图像中的重要特征,如边缘、纹理和区域等。
在实际应用中,可以利用二维傅里叶变换低频部分来增强图像中的低频成分,如平滑噪声或增强边缘。
同时,也可以通过滤波器来抑制高频成分或突出低频成分,以实现各种图像处理的目的。
总之,二维傅里叶变换低频部分在图像处理中具有重要的作用,可以帮助我们更好地理解和分析图像内容。
傅里叶变换求相位 opencv -回复

傅里叶变换求相位opencv -回复傅里叶变换是一种将时域信号转换为频域信号的数学工具。
它可以分解一个信号的周期和幅度频率成分,从而可以得到信号的频谱信息。
在计算机视觉领域,傅里叶变换被广泛应用于图像处理和分析中,可以用来提取图像中的特征信息或进行频域滤波等操作。
本文将重点介绍在OpenCV中如何使用傅里叶变换求解图像的相位信息。
1. 加载图像首先,我们需要加载一张图像。
在OpenCV中,可以使用cv::imread()函数来读取图像文件,并将其保存为一个OpenCV矩阵格式。
例如,下面的代码演示了如何加载一张名为"image.jpg"的图像:cv::Mat image = cv::imread("image.jpg", cv::IMREAD_GRAYSCALE);这里使用了cv::IMREAD_GRAYSCALE参数,表示加载图像为灰度图像。
因为相位是一个表示图像亮度变化的特征,所以我们通常将图像转换为灰度图像来进行处理。
2. 进行傅里叶变换接下来,我们要对图像进行傅里叶变换。
在OpenCV中,可以使用cv::dft()函数来计算图像的离散傅里叶变换。
该函数接受两个参数,第一个参数是输入图像的矩阵,第二个参数是输出矩阵,用于保存变换后的结果。
下面的代码演示了如何进行傅里叶变换:cv::Mat complexImage;cv::dft(image, complexImage);在这里,我们将变换结果保存在一个名为complexImage的矩阵中。
这个矩阵由两个通道组成,一个通道保存了变换后的实部,另一个通道保存了变换后的虚部。
3. 计算相位信息为了计算图像的相位信息,我们需要从变换后的结果中提取实部和虚部。
可以使用cv::split()函数将复数矩阵分离成两个矩阵,分别保存实部和虚部。
下面的代码演示了如何进行分离:cv::Mat planes[2];cv::split(complexImage, planes);cv::Mat realPart = planes[0];cv::Mat imagPart = planes[1];现在,我们已经得到了图像的实部和虚部矩阵。
傅里叶变换求相位 opencv

傅里叶变换在图像处理领域中占据着非常重要的地位,它不仅可以将图像从空间域转换到频率域,还可以提取图像中的频率信息,对图像进行滤波、压缩等操作。而求取傅里叶变换的相位则是利用频率信息进行图像恢复和重建的重要一步。
在OpenCV中,求取傅里叶变换的相位的方法有很多种,下面将介绍其中的几种常用方法,并通过实例演示它们的具体应用。
1. 傅里叶变换简介 傅里叶变换是将一个信号从时域转换到频域的一种重要数学工具。在图像处理中,对图像进行傅里叶变换可以得到图像中的频率信息,帮助我们理解图像的结构和特征。
2. 傅里叶变换的振幅和相位 傅里叶变换将一个信号分解为多个不同频率的正弦和余弦函数的叠加,其中振幅表示每个频率成分的大小,相位表示每个频率成分的相位差。求取傅里叶变换的相位是通过振幅和相位信息的分离来进行的。
3. OpenCV中的傅里叶变换 OpenCV是一个非常流行和强大的开源计算机视觉库,它提供了丰富的图像处理工具和函数。在OpenCV中,可以通过dft函数对图像进行傅里叶变换,得到图像的频率信息。 4. 求取傅里叶变换的相位的方法 在OpenCV中,求取傅里叶变换的相位可以通过以下几种方法实现: - 方法一:使用dft函数求取傅里叶变换的实部和虚部,然后通过arctan函数计算相位。 - 方法二:直接使用phase函数获取傅里叶变换的相位信息。 - 方法三:将傅里叶变换结果转换为极坐标形式,然后取出相位信息。
5. 实例演示 接下来通过一个具体的例子来演示如何在OpenCV中求取傅里叶变换的相位。读取一张图像并将其转换为灰度图像,然后利用dft函数对其进行傅里叶变换。使用上述介绍的三种方法分别求取傅里叶变换的相位,并展示结果。
6. 总结 通过本文的介绍和实例演示,我们了解了在OpenCV中求取傅里叶变换的相位的几种常用方法。这些方法可以帮助我们对图像进行频率域分析和处理,为图像恢复、特征提取等任务提供有力的支持。愿本文对您有所帮助,谢谢阅读。
傅里叶变换
少将图像的傅立叶变换,原始图像由N行N列构成,N必须是基2的,把这个N*N个包含图像的点称为实部,另外还需要N*N个点称为虚部,因为FFT是基于复数的,如下图所示:(//实数DFT将时域内的N个点变换为频域中两组各N/2+1个点(分别对应实部和虚部))计算图像傅立叶变换的过程很简单:首先对每一行做一维FFT,然后对每一列做一维FFT。
具体来说,先对第0行的N个点做FFT(实部有值,虚部为0),将FFT输出的实部放回原来第0行的实部,FFT输出的虚部放回第0行的虚部,这样计算完全部行之后,图像的实部和虚部包含的是中间数据,然后用相同的办法进行列方向上的FFT变换,这样N*N的图像经过FFT得到一个N*N的频谱。
下面展示了一副图像的二维FFT变换:频域中可以包含负值,图像中灰色表示0,黑色表示负值,白色表示正值。
可以看到4个角上的黑色更黑,白色更白,表示其幅度更大,其实4个角上的系数表示的是图像的低频组成部分,而中心则是图像的高频组成部分。
除此以外,FFT的系数显得杂乱无章,基本看不出什么。
将上述直角坐标转换为极坐标的形式,稍微比较容易理解一点,幅度中4个角上白色的区域表示幅度较大,而相位中高频和低频基本看不出什么区别来。
上述以一种不同的方法展示了图像频谱,它将低频部分平移到了频谱的中心(//MATLAB中实现函数fftshift)。
这个其实很好理解,因为经2D-FFT的信号是离散图像,其2D-FFT的输出就是周期信号,也就是将前面一张图周期性平铺,取了一张以低频为中心的图。
将原点放在中心有很多好处,比如更加直观更符合周期性的原理,但在这节中还是以未平移之前的图来解释。
行N/2和列N/2将频域分成四块。
对实部和幅度来说,右上角和左下角成镜像关系,左上角和右下角也是镜像关系;对虚部和相位来说,也是类似的,只是符号要取反(//共轭?),这种对称性和1维傅立叶变换是类似的,你可以往前看看。
为简单起见,先考虑4*4的像素,右边是其灰度值,对这些灰度值进行2维fft变换。
傅里叶变换轮廓术ftp
傅里叶变换轮廓术(Fourier Transform Contouring)是一种基于傅里叶变换的图像处理技术,用于在二维图像中提取轮廓信息并可视化。
它通过将原始图像从空间域转换到频率域,再通过傅里叶反变换将结果映射回空间域,从而实现轮廓的提取和可视化。
傅里叶变换轮廓术的基本原理是利用傅里叶变换将图像从空间域转换到频率域,通过对频率域的图像进行分析和处理,可以提取出图像中的轮廓信息。
在频率域中,图像的轮廓表现为高频成分,而其他背景噪声和细节则表现为低频成分。
通过设置适当的阈值,可以将高频成分与背景噪声区分开来,从而提取出轮廓信息。
具体而言,傅里叶变换轮廓术通常包括以下步骤:1. 获取原始图像,并将其转换为灰度图像(如果原始图像是彩色图像)。
2. 对灰度图像进行傅里叶变换,得到频率域的图像。
3. 对频率域的图像进行滤波处理,去除低频成分和背景噪声,保留高频成分。
4. 对滤波后的频率域图像进行反变换,得到恢复后的轮廓图像。
5. 可视化恢复后的轮廓图像,以便观察和分析。
傅里叶变换轮廓术具有以下优点:1. 可有效地提取出图像中的轮廓信息,有助于识别和定位目标对象。
2. 适用于各种类型的图像,包括灰度图像、彩色图像和视频等。
3. 计算量相对较小,适用于实时处理和可视化。
然而,傅里叶变换轮廓术也存在一些局限性:1. 提取的轮廓可能受到滤波器设置的影响,需要选择合适的滤波器参数。
2. 对于复杂背景和噪声环境,提取的轮廓可能不够准确和清晰。
3. 对于大尺寸图像,计算量较大,可能需要使用更高效的算法和技术。
总之,傅里叶变换轮廓术是一种有效的图像处理技术,可用于提取和可视化二维图像中的轮廓信息。
它具有广泛的应用前景,但也需要注意算法的选择和参数的设置,以获得更好的处理效果。
图像变换-DFT
x 10 3.5
7
3
2.5
2
1.5
1
0.5
结果2
clf I=imread('demo.jpg'); I1=fftshift(fft2(I)); imshow(log(1+10*abs(I1)),[]) colormap(jet(256)),colorbar
离散傅里叶变换的Matlab实现
例3.4 尺度变换
clc;clear; I=zeros(256,256);I(8:248,110:136)=5; I1=fft2(I); I2=abs(I1); I3=fftshift(I2); for i=1:256 for j=1:256 J(i,j)=I(i,j)*0.1; end end J1=fft2(J); J2=abs(J1); J3=fftshift(J2); subplot(2,2,1);imshow(I);title('原始图像'); subplot(2,2,2);imshow(I3,[5,30]);title('原始图像的频谱'); subplot(2,2,3);imshow(J);title('乘以系数之后的图像'); subplot(2,2,4);imshow(J3,[5,30]);title('变换之后图像的频谱');
5 图像变换(1)
离散傅立叶变换(DFT)
什么图像变换?
所谓图像变换 图像变换,就是通过变换矩阵,将图像 图像变换 矩阵变换成另一个矩阵。变换后图像可以更 方便、更容易的进行处理和操作。 通常,变换后的图像能体现图像的频率特征, 可以用于图像的数据压缩和各种处理。
一维傅里叶变换 二维傅里叶变换
一维傅里叶变换和二维傅里叶变换是信号处理和图像处理中非常重要的数学工具,它们能帮助我们分析和理解信号和图像中包含的信息。
在本文中,我们将深入探讨一维和二维傅里叶变换的原理、应用以及它们在实际中的意义。
1. 一维傅里叶变换一维傅里叶变换是将一个实际的信号在频域进行分解的技术。
它的数学表达式为:\[F(k) = \sum_{n=0}^{N-1} f(n)e^{-i2\pi kn/N}\]在这个公式中,\(f(n)\)表示信号在时域上的取值,而\(F(k)\)表示信号在频域上的频谱。
一维傅里叶变换可以帮助我们分析信号中包含的频率成分,从而理解信号的特性和结构。
一维傅里叶变换在很多领域都有广泛的应用,比如音频信号处理、通信系统、生物医学工程等。
在音频信号处理中,我们可以利用傅里叶变换将音频信号分解成不同的频率成分,从而实现音频滤波、频谱分析等功能。
2. 二维傅里叶变换二维傅里叶变换是将一个二维图像在频域进行分解的技术。
它的数学表达式为:\[F(u, v) = \sum_{x=0}^{M-1} \sum_{y=0}^{N-1} f(x, y)e^{-i2\pi (ux/M + vy/N)}\]在这个公式中,\(f(x, y)\)表示图像在空间域上的像素值,而\(F(u, v)\)表示图像在频域上的频谱。
二维傅里叶变换可以帮助我们分析图像的纹理、边缘、轮廓等特征。
二维傅里叶变换在图像处理、计算机视觉、模式识别等领域都有重要的应用。
在图像处理中,我们可以利用傅里叶变换进行图像增强、滤波、压缩等操作,从而改善图像的质量和准确度。
总结回顾通过本文的深入探讨,我们了解了一维和二维傅里叶变换的原理、应用以及在实际中的意义。
一维傅里叶变换可以帮助我们分析信号中的频率成分,而二维傅里叶变化则可以帮助我们分析图像中的纹理特征。
这两种变换在信号处理和图像处理领域发挥着重要作用,为我们理解和处理现实世界中的信息提供了有力的数学工具。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验三、图像的傅立叶变换一、实验目的1.了解图像变换的意义和手段;2.熟悉傅里叶变换的基本性质;3.熟练掌握FFT的方法及应用;4.通过实验了解二维频谱的分布特点;5.通过本实验掌握编程实现数字图像的傅立叶变换。
二、实验原理1.应用傅立叶变换进行图像处理傅里叶变换是线性系统分析的一个有力工具,它能够定量地分析诸如数字化系统、采样点、电子放大器、卷积滤波器、噪音和显示点等的作用。
通过实验培养这项技能,将有助于解决大多数图像处理问题。
对任何想在工作中有效应用数字图像处理技术的人来说,把时间用在学习和掌握博里叶变换上是很有必要的。
2.傅立叶(Fourier)变换的定义对于二维信号,二维Fourier变换定义为:二维离散傅立叶变换为:图像的傅立叶变换与一维信号的傅立叶变换变换一样,有快速算法,具体参见参考书目,有关傅立叶变换的快速算法的程序不难找到。
实际上,现在有实现傅立叶变换的芯片,可以实时实现傅立叶变换。
三、实验要求:1.实验之前要预习2.独立完成程序的编写3.写出实验报告4.实验每组1人5.实验设备:每组计算机一台四、实验内容1.实验程序和流程图1)程序整体流程图2)傅里叶算法分析通常的FFT算法:直接计算离散傅立叶变换具有n^2的复杂度,而cooley 和tukey在1965年发现了一种计算离散傅立叶变换的快速算法(即通常所说的FFT算法),这个算法在计算变换长度n=2^k的离散傅立叶变换时,具有n*k的复杂度,即O(n)=n*log2(n),下面以此为例,讲讲快FFT的特点。
(1)复数运算:傅立叶变换是基于复数的,因此首先知道复数的运算规则,在FFT算法中,只涉及复数的加、减和乘法三种运算。
一个复数可表示为c=(x,yi),x 为复数的实部,y为复数的虚部,i为虚数单位,等于-1的平方根。
复数的运算规则是:若c1表示为(x1,y1),c2表示为(x2,y2),则(x1+x2,y1+y2)和(x1-x2,y1-y2)分别等于c1+c2的和,c1-c2的差,复数的乘法相对复杂一些,c1*c2的积为(x1*x2-y1*y2,x1*y2+x2*y1).(2)蝶形变换:普通的FFT算法称为基2的FFT算法,这种算法的核心是蝶形变换长度为n=2^k1的变换共需要做k1*n/2次蝶形变换,若需变换数据表示为一个复数数组c[],则每次蝶形变换有2个输入c[i],c[i+s],两个输出:c[i],c[i+s],s成为翅间距。
每个变换的基本算法是:t=wr*c[i+s];c[i+s]=c[i]-t;c[i]=c[i]+t;前面说过,长度为n=2^k1的变换共需要做k1*n/2次变换,实际的程序是一个3层循环,共需要k1*k2*(k3/2)次变换(k2*k3/2=n/2)。
前面的wr是w的整数次方,w=e^(-2*PI/k3)(k3=2,4,8,16...n,PI是圆周率),也成为旋转因子,例如n=32的变换需要log2(32)=5趟变换:第1趟变换需要16*1次变换,翅间距是1,若w=e^(-2*PI/2),则wr=w^1 第2趟变换需要8*2次变换,翅间距是2,若w=e^(-2*PI/4),则wr=w^1,w^2 第3趟变换需要4*2次变换,翅间距是4,若w=e^(-2*PI/8),则wr=w^1,w^2,w^3,w^4第4趟变换需要2*8次变换,翅间距是8,若w=e^(-2*PI/16),则wr=w^1,w^2,w^3,w^4,w^5,w^6,w^7,w^8第5趟变换需要16*1次变换,翅间距是16,若w=e^(-2*PI/32),则wr=w^1,w^2,w^3,w^4,w^5...w^15,w^16(3)w数组,w的实部=cos(2*PI/k3),w的虚部=-sin(2*PI/k3),计算出w,则wr 数组就好求了,不断即相乘即可,当然也可以通过三角函数直接求。
w^p的实部=cos(2*PI/K3*p),虚部=-sin(2*PI/k3*p)(4)复数数组排序,在基2的蝶形变换中,复数数组需要重新排序,c[i]要放置到数组c的第reverse(c[i])的位置,m=reverse(n)函数的算法是这样的,若n的k位2进制的为b[],b[k-1],B[k-2],...b[2],b[1],b[0],(b[i]等于1或者0,b[0]为最低bit).则m=reverse(n)的2进制的为b[0],b[1],b[2],b[3],...b[k-1](b[k-1]为最低bit).程序代码// MyDIPDoc.cpp : implementation of the CMyDIPDoc class//#include "stdafx.h"#include "MyDIP.h"#include "MyDIPDoc.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif///////////////////////////////////////////////////////////////////////////// // CMyDIPDocIMPLEMENT_DYNCREATE(CMyDIPDoc, CDocument)BEGIN_MESSAGE_MAP(CMyDIPDoc, CDocument)//{{AFX_MSG_MAP(CMyDIPDoc)// NOTE - the ClassWizard will add and remove mapping macros here.// DO NOT EDIT what you see in these blocks of generated code!//}}AFX_MSG_MAPEND_MESSAGE_MAP()///////////////////////////////////////////////////////////////////////////// // CMyDIPDoc construction/destructionCMyDIPDoc::CMyDIPDoc(){// TODO: add one-time construction code herem_sizeDoc.cx = 800;m_sizeDoc.cy = 600;m_palDIB = NULL;m_hDIB = NULL;}CMyDIPDoc::~CMyDIPDoc(){if (m_hDIB != NULL){::GlobalFree((HGLOBAL) m_hDIB);m_hDIB=NULL;}if (m_palDIB != NULL){delete m_palDIB;m_palDIB=NULL;}}BOOL CMyDIPDoc::OnNewDocument(){if (!CDocument::OnNewDocument())return FALSE;// TODO: add reinitialization code here// (SDI documents will reuse this document)m_hDIB = NewDIB(m_sizeDoc.cx, m_sizeDoc.cy,8);InitDIBData();return TRUE;}///////////////////////////////////////////////////////////////////////////// // CMyDIPDoc serializationvoid CMyDIPDoc::Serialize(CArchive& ar){if (ar.IsStoring()){// TODO: add storing code here}else{// TODO: add loading code here}}///////////////////////////////////////////////////////////////////////////// // CMyDIPDoc diagnostics#ifdef _DEBUGvoid CMyDIPDoc::AssertValid() const{CDocument::AssertValid();}void CMyDIPDoc::Dump(CDumpContext& dc) const{CDocument::Dump(dc);}#endif //_DEBUG/////////////////////////////////////////////////////////////////////////////// CMyDIPDoc commandsBOOL CMyDIPDoc::ReadImgFile(CString sName){if (m_hDIB != NULL){::GlobalFree((HGLOBAL) m_hDIB);m_hDIB=NULL;}if (m_palDIB != NULL){delete m_palDIB;m_palDIB=NULL;}// replace calls to Serialize with ReadDIBFile function CFile nFile;if(!nFile.Open(sName,CFile::modeRead))return false;m_hDIB = ReadDIBFile(nFile);nFile.Close();InitDIBData();if (m_hDIB == NULL)return FALSE;return TRUE;}BOOL CMyDIPDoc::InitDIBData(){if (m_palDIB != NULL){delete m_palDIB;m_palDIB = NULL;}if (m_hDIB == NULL){return FALSE;}m_palDIB = new CPalette;if (m_palDIB == NULL){// we must be really low on memory::GlobalFree((HGLOBAL) m_hDIB);m_hDIB = NULL;return FALSE;}if (::CreateDIBPalette(m_hDIB, m_palDIB) == NULL){// DIB may not have a palettedelete m_palDIB;m_palDIB = NULL;}return TRUE;}BOOL CMyDIPDoc::OnOpenDocument(LPCTSTR lpszPathName){if (!CDocument::OnOpenDocument(lpszPathName))return FALSE;// TODO: Add your specialized creation code hereBOOL b = ReadImgFile(lpszPathName);if(b){LPSTR lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) m_hDIB);m_sizeDoc.cx = (int) ::DIBWidth(lpDIB); // Size of DIB - xm_sizeDoc.cy = (int) ::DIBHeight(lpDIB); // Size of DIB - y::GlobalUnlock((HGLOBAL) m_hDIB);}POSITION pos;pos = GetFirstViewPosition();while(pos != NULL){CScrollView * pView = (CScrollView *)GetNextView(pos);if(pView != NULL){pView->SetScrollSizes(MM_TEXT, m_sizeDoc);}}return b;}BOOL CMyDIPDoc::OnSaveDocument(LPCTSTR lpszPathName){// TODO: Add your specialized code here and/or call the base classCFile nFile;if(m_hDIB == NULL)return false;nFile.Open(lpszPathName,CFile::modeWrite | CFile::modeCreate);SaveDIB(m_hDIB, nFile);nFile.Close();return true;//return CDocument::OnSaveDocument(lpszPathName);}3)furious算法程序实现傅里叶算法流程图furious算法流程图程序代码// MyDIPView.cpp : implementation of the CMyDIPView class//#include "stdafx.h"#include "MyDIP.h"#include "MyDIPDoc.h"#include "MyDIPView.h"#include "math.h"#include<complex>using namespace std;#define PI 3.14159#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif/************************************************************************** 函数名称:* FFT()* 参数:* complex<double> * TD - 指向时域数组的指针* complex<double> * FD - 指向频域数组的指针* r -2的幂数,即迭代次数* 返回值:* 无。