精华内容
下载资源
问答
  • Matlab对图像进行傅里叶变换实例

    万次阅读 多人点赞 2019-04-10 22:15:55
    使用matlabpeppers.png图像进行二维傅里叶快速变换及逆变换,从简单的实例中发现问题

    一、实验目的

    1、了解图像变换的意义和手段;
    2、熟悉傅里叶变换的基本性质;
    3、熟练掌握FFT的方法与应用;
    4、通过实验了解二维频谱的分布特点;
    5、通过本实验掌握利用MATLAB编程,实现数字图像的傅里叶变换。

    二、实验仪器

    1、计算机;
    2、MATLAB程序;
    3、移动式存储器(软盘、U盘等);
    4、记录用的笔、纸。

    三、实验原理

    1、应用傅里叶变换进行图像处理
    傅里叶变换是线性系统分析的一个有力工具,它能够定量地分析诸如数字化系统、采样点、电子放大器、卷积滤波器、噪音和显示点等的作用。通过实验培养这项技能,将有助于解决大多数图像处理问题。对任何想在工作中有效应用数字图像技术的人来说,把时间用在学习和掌握傅里叶变换上是很有必要的。
    2、傅里叶(Fourier)变换的定义
    对于二维信号,二维Fourier变换定义为:
    二维Fourier变换
    逆变换:
    二维离散傅里叶
    二维离散傅里叶变换为:
    二维离散傅里叶变换
    逆变换:
    逆变换
    图像的傅里叶变换与一维信号的傅里叶变换一样,有快速算法,具体参见参考书目,有关傅里叶变换的快速算法的程序不难找到。实际上,现在有实现傅里叶变换的芯片,可以实时实现傅里叶变换。
    3、利用MATLAB软件实现数字图像傅里叶变换、DCT变换的程序。

    四、实验步骤

    1、打开计算机,安装和启动MATLAB程序;程序组中“work”文件夹中应有待处理的图像文件;
    2、利用MATLAB工具箱中的函数绘制FFT频谱显示的函数;
    3、a)调入、显示图像;
    b)对这图像做FFT、DCT并利用自编的函数显示其频谱;
    c)讨论不同的图像内容与FFT、DCT频谱之间的对应关系。
    4、记录和整理实验报告。

    五、实验内容

    MATLAB源程序如下:

    clear
    clc
    img=imread('peppers.png');
    subplot(2,2,1);imshow(img);title('原图');
    f=rgb2gray(img);    %对于RGB图像必须做的一步,也可以用im2double函数
    F=fft2(f);          %傅里叶变换
    F1=log(abs(F)+1);   %取模并进行缩放
    subplot(2,2,2);imshow(F1,[]);title('傅里叶变换频谱图');
    Fs=fftshift(F);      %将频谱图中零频率成分移动至频谱图中心
    S=log(abs(Fs)+1);    %取模并进行缩放
    subplot(2,2,3);imshow(S,[]);title('频移后的频谱图');
    fr=real(ifft2(ifftshift(Fs)));  %频率域反变换到空间域,并取实部
    ret=im2uint8(mat2gray(fr));    %更改图像类型
    subplot(2,2,4);imshow(ret),title('逆傅里叶变换');
    

    六、实验结果

    在MATLAB中运行后,实验结果如图:
    在Figure1中,左上角显示的是读入MATLAB程序的原图片,右上角显示的是经过二维傅里叶快速变换后的频谱图像,左下角显示的是将频谱中零频率成分移至矩阵的中心后的频谱图像。右下角显示的是二维傅里叶逆变换后的图像。

    图1 MATLAB程序运行后结果
    图1 MATLAB程序运行后结果

    七、实验中遇到的问题及对实验过程的思考

    1、关于imshow函数:
    使用imshow函数显示图像时要注意图像矩阵类型,当图像是double类型时要使用imshow(I,[])来根据数据矩阵的数值范围自动设置灰度图像显示范围。
    详细可参考matlab官网参考文档:显示图像-MATLAB imshow-MathWorks中国

    2、关于运行时可能出现的警告:
    如果图像进行傅里叶转换后立即用imshow函数显示,则在命令行可能会显示:Warning: Displaying real part of complex input(警告: 显示复数输入项的实部)。这是因为经过傅里叶变换后的图像矩阵大多是复数矩阵,包含实部和虚部。此时如要显示图像则需要先用abs取复数矩阵的模,再进行显示。
    取模后图像矩阵的数值一般会很大,直接用imshow函数是无法显示的,此时可以用log函数取其对数,如log(abs(F)+1),这样就可以对频谱进行缩放。至于为什么用log(F+1),如下图所示,对于(0,1)之间的x值经过取对数后会变成负值,而log(x+1)则将所有的x值映射到正数范围内。
    图2 log
    图2 log

    3、关于开头im2double和rgb2gray函数的使用:
    对于RGB真彩图像来说,读入后是以三维矩阵形式存储的,如果此时直接进行傅里叶变换,则频谱图会显示为一片空白或者是密密麻麻的。所以在对RGB图像进行傅里叶变换前要进行类型转换,可以使用im2double将其转换为双精度型(图像运算很少有整型的,所以保守起见不管什么图像都先用这个函数进行转换),或者使用rgb2gray将其转换为灰度图像。
    使用不同的函数其变换效果也是不一样的。如使用im2double,进行傅里叶变换后其频谱图呈白色基调,使用rgb2gray其频谱图呈灰色基调。

    4、关于最后使用im2uint8转换图像类型:
    这一步是为了将逆转换得到的矩阵先转换为灰度图像(mat2gray),再将图像类型转换为uint8。其实这一步的调用与否与开头两个类型转换函数的使用有关,如果在开头就已经将RGB图像转为灰度图像,则此步骤可省去,直接显示经逆转换的图像。如果开头调用im2double,此步省略后可显示出彩色图像。当然此步骤在不同方面发挥着不同作用,取的灰度图像可以为后续操作提供基础。

    更多函数信息可参考matlab官网 MATLAB-函数

    如有错漏之处敬请指正

    展开全文
  • 使用C++、opencv对图像进行傅里叶变换,再根据频谱图原图进行旋转 离散傅里叶变换(Discrete Fourier transform,缩写为DFT),是指傅里叶变换在时域和频域上都呈现离散的形式,将时域信号的采样变换为在离散时间...

    使用C++、opencv对图像进行傅里叶变换,再根据频谱图对原图进行旋转

            离散傅里叶变换(Discrete Fourier transform,缩写为DFT),是指傅里叶变换在时域和频域上都呈现离散的形式,将时域信号的采样变换为在离散时间傅里叶变换(DIFT)频域的采样。在形式上,变换两端(时域和频域上)的序列是有限长的,而实际上这两组序列都应当被认为是离散周期信号的主值序列。即使对有限长的离散信号做DFT,也应当对其经过周期延拓成为周期信号再进行变换。在实际应用中,通常采用快速傅里叶变换来高效计算DFT。

            简单来说,对一张图像使用傅里叶变换就是将它分解成正弦和余弦两部分,也就是将图像从空间域(spatial domain)转换到频域(frequency domain)。这一转换的理论基础为:任一函数都可以表示成无数个正弦和余弦函数的和的形式。傅里叶变换就是一个用来将函数分解的工具二维图像的傅里叶变换可以用以下数学公式表达。

            式中f是空间域(spatial domain)值,F是频域(frequency domain)值。转换之后的频域值是复数,因此,显示傅里叶变换之后的结果需要使用实数图像(real image)加虚数图像(complex image),或者幅度图像(magitude image)加相位图像(phase image)的形式。在实际的图像处理过程中,仅仅使用了幅度图像,因为幅度图像包含了原图像的几乎所有我们需要的几何信息。然而,如果想通过修改幅度图像或者相位图像的方法来间接修改原空间图像,需要使用逆傅里叶变换得到修改后的空间图像,这样就必须同时保留幅度图像和相位图像了。

            在频域里面,对于一幅图像,高频部分代表了图像的细节、纹理信息;低频部分代表了图像的轮廓信息。如果对一幅精细的图像使用低通滤波器,那么滤波后的结果就只剩下轮廓了。这与信号处理的基本思想是相通的。如果图像受到的噪声恰好位于某个特定的“频率”范围内,则可以通过滤波器来恢复原来的图像。傅里叶变换在图像处理中可以做到图像増强与图像去噪、图像分割之边缘检测、图像特征提取、图像压缩等。

    关于傅里叶变换更详细的原理可参考博客:https://blog.csdn.net/u013921430/article/details/79683853


    opencv中关于傅里叶变换的API:

    void dft(InputArray src, OutputArray dst, int flags=0, int nonzeroRows=0); 

    dft函数的作用是对一维或二维浮点数数组进行正向或反向离散傅里叶变换。

    InputArray src: 输入图像,可以是实数或虚数 
    OutputArray dst: 输出图像,其大小和类型取决于第三个参数flags 
    int flags = 0: 转换的标识符,有默认值0.其可取的值如下所示: 

    • DFT_INVERSE: 用一维或二维逆变换取代默认的正向变换 
    • DFT_SCALE: 缩放比例标识符,根据数据元素个数平均求出其缩放结果,如有N个元素,则输出结果以1/N缩放输出,常与DFT_INVERSE搭配使用。 
    • DFT_ROWS: 对输入矩阵的每行进行正向或反向的傅里叶变换;此标识符可在处理多种适量的的时候用于减小资源的开销,这些处理常常是三维或高维变换等复杂操作。 
    • DFT_COMPLEX_OUTPUT: 对一维或二维的实数数组进行正向变换,这样的结果虽然是复数阵列,但拥有复数的共轭对称性(CCS),可以以一个和原数组尺寸大小相同的实数数组进行填充,这是最快的选择也是函数默认的方法。你可能想要得到一个全尺寸的复数数组(像简单光谱分析等等),通过设置标志位可以使函数生成一个全尺寸的复数输出数组。 
    • DFT_REAL_OUTPUT: 对一维二维复数数组进行逆向变换,这样的结果通常是一个尺寸相同的复数矩阵,但是如果输入矩阵有复数的共轭对称性(比如是一个带有DFT_COMPLEX_OUTPUT标识符的正变换结果),便会输出实数矩阵。 

    int nonzeroRows = 0: 当这个参数不为0,函数会假设只有输入数组(没有设置DFT_INVERSE)的第一行或第一个输出数组(设置了DFT_INVERSE)包含非零值。这样的话函数就可以对其他的行进行更高效的处理节省一些时间,这项技术尤其是在采用DFT计算矩阵卷积时非常有效。

    int getOptimalDFTSize(int vecsize);

    getOptimalDFTSize函数返回给定向量尺寸的傅里叶最优尺寸大小。为了提高离散傅里叶变换的运行速度,需要扩充图像,而具体扩充多少,就由这个函数来计算得到。

    此函数的唯一一个参数为int类型的 vecsize,向量尺寸,即图片的rows、cols。

    DFT变换在一个向量尺寸上不是一个单调函数,当计算两个数组卷积或对一个数组进行光学分析,它常常会用0扩充一些数组来得到稍微大点的数组以达到比原来数组计算更快的目的。一个尺寸是2阶指数(2,4,8,16,32…)的数组计算速度最快,一个数组尺寸是2、3、5的倍数(例如:300 = 5*5*3*2*2)同样有很高的处理效率。 
    getOptimalDFTSize()函数返回大于或等于vecsize的最小数值N,这样尺寸为N的向量进行DFT变换能得到更高的处理效率。在当前N通过p,q,r等一些整数得出N = 2^p*3^q*5^r. 
    这个函数不能直接用于DCT(离散余弦变换)最优尺寸的估计,可以通过getOptimalDFTSize((vecsize+1)/2)*2得到。

    void copyMakeBorder(InputArray src, OutputArray dst, int top, int bottom, int left, int right, int borderType, const Scalar& value=Scalar() );

    copyMakeBorder函数的作用是扩充图像边界。

    第一个参数, InputArray类型的src,输入图像,即源图像,填Mat类的对象即可。
    第二个参数, OutputArray类型的dst,函数调用后的运算结果存在这里,即这个参数用于存放函数调用后的输出结果,需和源图片有一样的尺寸和类型,且size应该为Size(src.cols+left+right,src.rows+top+bottom)。
    接下来的4个参数分别为int类型的top、 bottom、left、 right,分别表示在源图像的四个方向上扩充多少像素,例如top=2, bottom=2,left=2, right=2就意味着在源图像的上下左右各扩充两个像素宽度的边界
    第七个参数, border Type类型的,边界类型,常见取值为BORDER CONSTANT,可参考 borderInterpolateO得到更多的细节。
    第八个参数, const Scalar&类型的 value,有默认值 Scalar,可以理解为默认值为0。当 border Type取值为 BORDER CONSTANT时,这个参数表示边界值。

    C++: void magnitude(InputArray x, InputArray y, OutputArray magnitude);

    magnitude函数用于计算二维矢量的幅值。

    InputArray x: 浮点型数组的x坐标矢量,也就是实部。
    InputArray y: 浮点型数组的y坐标矢量,必须和x尺寸相同。
    OutputArray magnitude: 与x类型和尺寸相同的输出数组,即幅度值。
    其计算公式如下: 

    void normalize(InputArray src, OutputArray dst, double alpha=1, double beta=0, int norm_type=NORM_L2, int dtype=-1, InputArray mask=noArray() )

    normalize函数的作用是进行矩阵的归一化。归一化就是把要处理的数据经过某种算法的处理限制在所需要的范围内。首先归一化是为了后面数据处理的方便,其次归一化能够保证程序运行时收敛加快。归一化的具体作用是归纳同意样本的统计分布性,归一化在0-1之间是统计的概率分布,归一化在某个区间上是统计的坐标分布,在机器学习算法的数据预处理阶段,归一化也是非常重要的步骤。

    第一个参数,InputArray类型的src。输入图像,即源图像,填Mat类的对象即可。
    第二个参数,OutputArray类型的dst。函数调用后的运算结果存在这里,和源图片有一样的尺寸和类型。
    第三个参数,double类型的 alpha。归一化后的最大值,有默认值1。
    第四个参数,double类型的beta。归一化后的最大值,有默认值0。
    第五个参数,int类型的 norm type。归一化类型,有NORM_INF、 NORM_L1、NORM_L2和 NORM_MINMAX等参数可选,有默认值 NORM_L2。

    第六个参数,int类型的 dtype,有默认值-1。当此参数取负值时,输出矩阵和src有同样的类型,否则,它和src有同样的通道数,且此时图像深度为CV_MAT_DEPTH(dtype)。
    第七个参数,InputArray类型的mask,可选的操作掩膜,有默认值noArray()。

    void HoughLines(InputArray image, OutputArray lines, double rho,double theta, int threshold, double srn=0, double stn=0)

    第一个参数,InputArray类型的Image,输入图像,即源图像。需为8位的单通道二进制图像,可以将任意的源图载入进来,并由函数修改成此格式后,再填在这里。

    第二个参数,InputArray类型的 lines,经过调用 HoughLines函数后储存了霍夫线变换检测到线条的输出矢量。每一条线由具有两个元素的矢量(ρ,θ)表示,其中,ρ是离坐标原点(0,0)(也就是图像的左上角)的距离,θ是弧度线条旋转角度(0度表示垂直线,π/2度表示水平线)。

    第三个参数,double类型的rho,以像素为单位的距离精度。另一种表述方式是直线搜索时的进步尺寸的单位半径。

    第四个参数,double类型的 theta,以弧度为单位的角度精度。另一种表述方式是直线搜索时的进步尺寸的单位角度。

    第五个参数,int类型的 threshold,累加平面的阈值参数,即识别某部分为图中的一条直线时它在累加平面中必须达到的值。大于阈值 threshold的线段才可以被检测通过并返回到结果中。

    第六个参数, double类型的srn,有默认值0。对于多尺度的霍夫变换,这是第三个参数进步尺寸rho的除数距离。粗略的累加器进步尺寸直接是第三个参数rho,而精确的累加器进步尺寸为 rho/srn。

    第七个参数, double类型的stn,有默认值0,对于多尺度霍夫变换,srn表示第四个参数进步尺寸的单位角度 theta的除数距离。且如果srm和stn同时为0,就表示使用经典的霍夫变换。否则,这两个参数应该都为正数。

    void warpAffine ( InputArray  src,OutputArray dst,InputArray M,Size  dsize, int  flags = INTER_LINEAR,int  borderMode = BORDER_CONSTANT,const Scalar & borderValue = Scalar() )

    第一个参数,InputArray类型的src,输入图像,即源图像,填Mat类的对象即可。

    第二个参数,OutputArray类型的dst,函数调用后的运算结果存在这里,需和源图片有一样的尺寸和类型。

    第三个参数,InputArray类型的M,2×3的变换矩阵。

    第四个参数,Size类型的size,表示输出图像的尺寸

    第五个参数,int类型的fags,插值方法的标识符。此参数有默认值INTER LⅠNEAR(线性插值),可选的插值方式如表7.1所示。

     

    第六个参数,int类型的borderMode,边界像素模式,默认值为BORDER CONSTANT。

    第七个参数,const scalar&类型的border value,在恒定的边界情况下取的值,默认值为Scalar,即0。


    代码如下:

    #include "stdafx.h"
    #include <opencv2/core/core.hpp>
    #include <opencv2/imgproc/imgproc.hpp>
    #include <opencv2/highgui/highgui.hpp>
    #include <iostream>
    #include "math.h"
    
    using namespace cv;
    using namespace std;
    
    #define GRAY_THRESH 150
    #define HOUGH_VOTE 100
    
    //#define DEGREE 27
    
    int main(int argc, char **argv)
    {
    	//以单通道(灰度)方式读取图像
    	const char* filename = "C:\\Users\\lenovo\\Desktop\\1.jpg";
    	Mat srcImg = imread(filename, CV_LOAD_IMAGE_GRAYSCALE);
    	if (srcImg.empty())
    		return -1;
    	imshow("source", srcImg);
    
    	Point center(srcImg.cols / 2, srcImg.rows / 2);
    
    #ifdef DEGREE
    	//旋转原图
    	Mat rotMatS = getRotationMatrix2D(center, DEGREE, 1.0);
    	warpAffine(srcImg, srcImg, rotMatS, srcImg.size(), 1, 0, Scalar(255, 255, 255));
    	imshow("RotatedSrc", srcImg);
    	//imwrite("imageText_R.jpg",srcImg);
    #endif
    
    	//将图像扩展到最佳大小,以获得更快的处理速度
    	//设置4个方向的边框宽度
    	//如果 borderType==BORDER_CONSTANT, 用(0,0,0)填充
    	Mat padded;
    	int opWidth = getOptimalDFTSize(srcImg.rows);
    	int opHeight = getOptimalDFTSize(srcImg.cols);
    	copyMakeBorder(srcImg, padded, 0, opWidth - srcImg.rows, 0, opHeight - srcImg.cols, BORDER_CONSTANT, Scalar::all(0));
    
    	Mat planes[] = { Mat_<float>(padded), Mat::zeros(padded.size(), CV_32F) };
    	Mat comImg;
    	//合并成一个双通道图像
    	merge(planes, 2, comImg);
    
    	//傅里叶变换
    	dft(comImg, comImg);
    
    	//计算幅值
    	//复数形式:planes[0]=Re(DFT(I)), planes[1]=Im(DFT(I))
    	//magnitude=sqrt(Re^2+Im^2)
    	split(comImg, planes);
    	magnitude(planes[0], planes[1], planes[0]);
    
    	//转换到log的尺度下,从而能观察到图像(否则数据过界)
    	//M2=log(1+M1)
    	Mat magMat = planes[0];
    	magMat += Scalar::all(1);
    	log(magMat, magMat);
    
    	//剪切和重分布幅度图象限
    
    	//若有奇数行或奇数列,进行裁剪
    	magMat = magMat(Rect(0, 0, magMat.cols & -2, magMat.rows & -2));
    
    	//重新排布傅里叶图像的4个象限,使原点位于图像中心,高频在角落
    	int cx = magMat.cols / 2;
    	int cy = magMat.rows / 2;
    
    	Mat q0(magMat, Rect(0, 0, cx, cy));
    	Mat q1(magMat, Rect(0, cy, cx, cy));
    	Mat q2(magMat, Rect(cx, cy, cx, cy));
    	Mat q3(magMat, Rect(cx, 0, cx, cy));
    
    	//交换象限
    	Mat tmp;
    	q0.copyTo(tmp);
    	q2.copyTo(q0);
    	tmp.copyTo(q2);
    
    	q1.copyTo(tmp);
    	q3.copyTo(q1);
    	tmp.copyTo(q3);
    
    	//将幅度标准化至 [0,1], 再转为[0,255]
    	normalize(magMat, magMat, 0, 1, CV_MINMAX);
    	Mat magImg(magMat.size(), CV_8UC1);
    	magMat.convertTo(magImg, CV_8UC1, 255, 0);
    	imshow("magnitude", magImg);
    	//imwrite("imageText_mag.jpg",magImg);
    
    
    
    	//以下部分是对频谱图像进行霍夫直线变换,找到角度值,利用该角度值对原图像进行旋转
    	//多适用于文字图像
    
    	//转为二值图像
    	threshold(magImg, magImg, GRAY_THRESH, 255, CV_THRESH_BINARY);
    	//imshow("mag_binary", magImg);
    	//imwrite("imageText_bin.jpg",magImg);
    
    	//旋转原图
    	//使用霍夫变换查找直线
    	vector<Vec2f> lines;
    	float pi180 = (float)CV_PI / 180;
    	Mat linImg(magImg.size(), CV_8UC3);
    	HoughLines(magImg, lines, 1, pi180, HOUGH_VOTE, 0, 0);
    	int numLines = lines.size();
    	for (int l = 0; l<numLines; l++)
    	{
    		float rho = lines[l][0], theta = lines[l][1];
    		Point pt1, pt2;
    		double a = cos(theta), b = sin(theta);
    		double x0 = a*rho, y0 = b*rho;
    		pt1.x = cvRound(x0 + 1000 * (-b));
    		pt1.y = cvRound(y0 + 1000 * (a));
    		pt2.x = cvRound(x0 - 1000 * (-b));
    		pt2.y = cvRound(y0 - 1000 * (a));
    		line(linImg, pt1, pt2, Scalar(255, 0, 0), 1, 8, 0);
    	}
    	imshow("lines", linImg);
    	//imwrite("imageText_line.jpg",linImg);
    	if (lines.size() == 3) {
    		cout << "found three angels:" << endl;
    		cout << lines[0][1] * 180 / CV_PI << endl << lines[1][1] * 180 / CV_PI << endl << lines[2][1] * 180 / CV_PI << endl << endl;
    	}
    
    	//Find the proper angel from the three found angels
    	float angel = 0;
    	float piThresh = (float)CV_PI / 90;
    	float pi2 = CV_PI / 2;
    	for (int l = 0; l<numLines; l++)
    	{
    		float theta = lines[l][1];
    		if (abs(theta) < piThresh || abs(theta - pi2) < piThresh)
    			continue;
    		else {
    			angel = theta;
    			break;
    		}
    	}
    
    	//计算旋转角度
    	//如果图像不是方的,旋转后可能会达不到预期效果
    	angel = angel<pi2 ? angel : angel - CV_PI;
    	if (angel != pi2) {
    		float angelT = srcImg.rows*tan(angel) / srcImg.cols;
    		angel = atan(angelT);
    	}
    	float angelD = angel * 180 / (float)CV_PI;
    	cout << "the rotation angel to be applied:" << endl << angelD << endl << endl;
    
    	//旋转图像
    	Mat rotMat = getRotationMatrix2D(center, angelD, 1.0);
    	Mat dstImg = Mat::ones(srcImg.size(), CV_8UC3);
    	warpAffine(srcImg, dstImg, rotMat, srcImg.size(), 1, 0, Scalar(255, 255, 255));
    	imshow("result", dstImg);
    	//imwrite("imageText_D.jpg",dstImg);
    	
    	waitKey(0);
    
    	return 0;
    }

    源图像:

    转化为频率域的幅度图像:

    霍夫直线变换找到的直线:

    旋转后的图像:

    以上参考:毛星云 《OpenCV3编程入门》

    https://blog.csdn.net/keith_bb/article/details/53389819

    更多关于傅里叶变换在图像中的应用可翻看:

    https://www.cnblogs.com/xh6300/p/5956503.html

    https://blog.csdn.net/u013921430/article/details/79934162

    https://www.jianshu.com/p/89ce7fdb9e12

    http://johnhany.net/2013/11/dft-based-text-rotation-correction/

     

    展开全文
  • 沈阳理工大学数字图像处理报告PAGE 10数字图像傅里叶变换课程设计目的(1)了解图像变换的意义和手段(2)熟悉傅里叶变换的基本性质(3)热练掌握FFT的方法反应用(4)通过本实验掌握利用MATLAB编程实现数字图像傅里叶...

    沈阳理工大学数字图像处理报告

    PAGE 10

    数字图像的傅里叶变换

    课程设计目的

    (1)了解图像变换的意义和手段

    (2)熟悉傅里叶变换的基本性质

    (3)热练掌握FFT的方法反应用

    (4)通过本实验掌握利用MATLAB编程实现数字图像的傅里叶变换

    二.课程设计要求

    (1)熟悉并掌握傅立叶变换

    (2)了解傅立叶变换在图像处理中的应用

    (3)通过实验了解二维频谱的分布特点

    (4)用MATLAB实现傅立叶变换仿真

    三.设计思路

    1.相关知识原理

    (1)应用傅里叶变换进行数字图像处理

    数字图像处理(digital image processing)是用计算机对图像信息进行处理的一门技术,使利用计算机对图像进行各种处理的技术和方法。? ?? 20世纪20年代,图像处理首次得到应用。20世纪60年代中期,随电子计算机的发展得到普遍应用。60年代末,图像处理技术不断完善,逐渐成为一个新兴的学科。利用数字图像处理主要是为了修改图形,改善图像质量,或是从图像中提起有效信息,还有利用数字图像处理可以对图像进行体积压缩,便于传输和保存。数字图像处理主要研究以下内容:傅立叶变换、小波变换等各种图像变换;对图像进行编码和压缩;采用各种方法对图像进行复原和增强;对图像进行分割、描述和识别等。随着技术的发展,数字图像处理主要应用于通讯技术、宇宙探索遥感技术和生物工程等领域。

    傅里叶变换在数字图像处理中广泛用于频谱分析,傅里叶变换是线性系统分析的一个有力工具,它使我们能够定量地分析诸如数字化系统,采样点,电子放大器,卷积滤波器,噪声,显示点等地作用(效应)。傅里叶变换(FT)是数字图像处理技术的基础,其通过在时空域和频率域来回切换图像,对图像的信息特征进行提取和分析,简化了计算工作量,被喻为描述图像信息的第二种语言,广泛应用于图像变换,图像编码与压缩,图像分割,图像重建等。因此,对涉及数字图像处理的工作者,深入研究和掌握傅里叶变换及其扩展形式的特性,是很有价值得。

    (2)关于傅里叶(Fourier)变换

    在信号处理中,傅里叶变换可以将时域信号变到频域中进行处理,因此傅里叶变换在信号处理中有着特殊重要的地位。

    傅里叶变换能将满足一定条件的某个函数表示成三角函数(正弦和/或余弦函数)或者它们的积分的线性组合。在不同的研究领域,傅里叶变换具有多种不同的变体形式,如连续傅里叶变换和离散傅里叶变换。傅里叶变换属于谐波分析。傅里叶变换的逆变换容易求出,而且形式与正变换非常类似;正弦基函数是微分运算的本征函数,从而使得线性微分方程的求解可以转化为常系数的代数方程的求解.在线性时不变的物理系统内,频率是个不变的性质,从而系统对于复杂激励的响应可以通过组合其对不同频率正弦信号的响应来获取; 卷积定理指出:傅里叶变换可以化复杂的卷积运算为简单的乘积运算,从而提供了计算卷积的一种简单手段; 离散形式的傅里叶变换可以利用数字计算机快速的算出(其算法称为快速傅里叶变换算法(FFT)).

    (3)傅里叶(Fourier)变换基本性质

    a.线性性质两函数之和的傅里叶变换等于各自变换之和。数学描述是:若函数f \left ( x\right )和g \left(x \right)的傅里叶变换\mathcal[f]和\mathcal[g]都存在,α 和 β 为任意常系数,则\mathcal[\alpha f+\beta g]=\alpha \ mathcal[f]+\beta\mathcal[g];傅里叶变换算符\mathcal可经归一化成为么正算符;b.频移性质若函数f \left( x\right )存在傅里叶变换,则对任意实数 ω0,函数f(x) e^{i \omega_ x}也存在傅里叶变换,且有\mathcal[f(x)e^{i \omega_ x}]=F(\omega + \omega _0 ) 。式中花体\mathcal是傅里叶变换的作用算子,平体F表示变换的结果(复函数),e 为自然对数的底,i 为虚数单位\sqrt;c.微分关系若函数f \left( x\right )当|x|\rightarrow\infty时的极限为0,而其导函数f'(x)的傅里叶变换存在,则有\mathcal[f'(x)]=-i \omega \mathcal[f(x)],即导函数的傅里叶变换等于原函数的傅里叶变换乘以因子--iω 。更一般地,若f(\pm\infty)=f'(\pm\infty)=\ldots=f^{(k-1)}(\pm\infty)=0,\mathcal[f^{(k)}(x)]存在,则\mathcal[f^{(k)}(x)]=(-i \omega)^ \mathcal[f] ,即 k 阶导数的傅里叶变换等于原函数的傅里叶变换乘以因子( ? iω)k。d.卷积特性若函数

    展开全文
  • 图像傅里叶变换

    千次阅读 2017-03-02 21:06:43
    图像傅里叶变换二维数据的DFT一维离散数据的FT过程是将一个一维整数数组变成了一个复数元素构成的数组。。考虑复数矩阵的相位,就是考虑三角函数的偏移情况。考虑幅度值,就是考察原数组整数的变化情况。例如:...

    图像的傅里叶变换

    二维数据的DFT

    一维离散数据的FT过程是将一个一维整数数组变成了一个复数元素构成的数组。。考虑复数矩阵的相位,就是考虑三角函数的偏移情况。考虑幅度值,就是考察原数组整数的变化情况。例如:变换幅度慢的就对低频成分贡献的多,变化快的就对高频成分有贡献。傅里叶变换其实也可以理解成是一个拟合的问题,这个拟合的基函数是三角函数。对于变换大的数值必然要用高频三角函数去拟合,反之亦然。
    那么,对于一副图像来说也是一样。数据(灰度)变化快的就是图像的边缘轮廓细节部分,数据变化慢的就是图像的常态部分。

    由一维FT推广到二维,很容易就得到二维数据的DFT表达式:
    这里写图片描述

    下面从lena图像的DFT入手,验证其复数矩阵的规律。
    这里写图片描述
    左边是一副灰度lena图像,右边使其DFT后复数矩阵的幅值经过偏移并取log后以矩阵的形式显示。

    取二维图像数据直接进行DFT后的复数矩阵,观察其数值:
    这里写图片描述
    纵向的对应u方向,横向对应v方向。左上角元素对应的是直流分量,显然它具有最大的幅度数值。

    一般不会取二维数据直接DFT数组,会对其进行shift平移,主要目的是将直流分量平移到数组的中心。
    这里写图片描述

    经过fftshift之后,现在的复数矩阵包含了一个完整的位于中心的周期。如上图所示,再直流分量的左右数据是对称的。同理,在直流量的上下两侧数据也是对称的。
    另外,fftshift运算实质是在时域将原始数据乘上了-1的(x+y)次方,频域上u,v方向产生了相应的平移,即:
    这里写图片描述

    幅度和相角

    介绍

    一个复数可以由虚部和实部来表征,当然也可以由幅度和相角来表征。同样,图像经过傅里叶变换后的复数矩阵也完全可以通过一个幅度矩阵和一个相角矩阵来表征这个复数矩阵的所有信息。

    将二维DFT通过极坐标来表示:
    这里写图片描述

    显然,幅度是:
    这里写图片描述

    相角表示为:
    这里写图片描述
    式中,I,R表示为F(u,v)的实部和虚部。

    另外,实数的FT是共轭对称的。所以,幅度信息一定式关于原点偶对称的,而相角信息是关于原点奇对称。

    考虑信号经过FT变换后,其幅度信息反映的是各个正弦分量频率大小而相角反映的是正弦分量的平移的度量。可想而知,图像经过平移后其FT变换后幅度信息是不会有变换的,而反映其平移信息应该是相角。而图像经过旋转其幅度信息必然改变,而且其幅度信息的旋转应该等于原始图像的旋转。

    相角幅度信息的重要性

    下面以实验的方式分别验证幅度信息与相位信息对一幅图像信息显示的重要性。

    这里写图片描述

    上图所示的图像从左到右一次是原lena图像,该图像F变换后的幅值和相角。图像经过F变换后并没有进行fftshit象限的变换。

    这里写图片描述

    以上三幅图像的第一幅是利用高斯模型产生的均值为120,方差为50的二维数组,其数组大小与lena图的大小一致。右边两张图仍然是其幅值和相角。
    这里写图片描述
    上图是图一的原图加上图二的纯噪声信息所构成的退化图像,右边两幅仍然是其幅值和相角。

    显而易见,图一包含图像的所有信息;图二不包含图像的任何信息;图三仅包含图像的部分信息。要了解图像傅里叶变换后幅度和相角对信息显示的重要性,可以分别选取图一的幅度与图二的相角以及图一的相角与图二的幅度进行重建图像。
    这里写图片描述
    上图是采用图一幅度和图二相角重建的图像,其包含和原图像灰度变换多少的信息量而缺少构建这样一组二维信息基波的偏移量。其重建图像所包含原图信息量基本能被预见到。

    这里写图片描述
    上图是采用图二幅度和图一相角重建的图像,虽然少了图像灰度值的变化多少的信息。但是,原图所有的相位信息是已知的,所有的相位信息与纯噪声的幅度信息所构成的图像可以传递原图像轮廓信息。
    由此可见,一副图像的相角对图像的信息传递具有很大的意义。
    这里的图像重建采用的幅度信息是纯噪声的幅值,其对原图的重建百害而无一益。试想:如果采用被高斯污染图像的幅度与原图相角进行重建,那么对原图的还原必然会达到更好的效果。
    这里写图片描述

    上图的实验结果确实也验证这样的想法,其对原图的还原虽然没有达到完美的效果,但是其对图像信息传递的角度来说已经足够了。

    幅度谱的向量化

    考虑图像经过F变换的幅度谱,它是关于原点对称的。如果以极坐标的形式来描述其幅度谱,那么,在某一个角度θ,可以得到在这个角度上各个频率的信息。在某个频率r则可以得到各个角度的频率信息。即:
    这里写图片描述

    这里写图片描述
    上图是一副杂乱排列的火柴图像,计算其S(r)及S(θ),画出的曲线如下图所示:

    这里写图片描述
    火柴的杂乱排序,其幅度谱必然不存在什么特定的规律。向量化后的幅度谱也无法观测出有意义的周期信息。

    这里写图片描述
    上图是一副整齐排列的火柴图像,再次计算其S(r)及S(θ),画出的曲线如下图所示:
    这里写图片描述
    而有序排列火柴图像的S(r)曲线在除了r=0之外在r=15以及r=25有明显的脉冲;相应的S(θ)曲线更明显的在θ=0°&180°以及θ=90°产生了明显的脉冲。
    由此可见,将幅度谱向量化,无论是从哪个图来看都是只是关注了谱的某一个方向上的信息而丢失了另一个方向的信息。但是当图像呈现周期性质的特性时,观测某一个维度就已经足够了。

    展开全文
  • 图像变换是数字图像处理中常用的技术,在图像增强、图像复原、图像压缩编码等数字图像处理中,都会用到图像变换技术,傅里叶变换是数字图像处理中应用最广的一种变换。 一、实验目的 (1)通过实验进一步加深对图像...
  • 首先我要说明的是,在使用OpenCV写代码做图像傅里叶变换的时候,并仅仅是调用dft函数做一个傅里叶变换这么简单的,而是先要图像进行一些变换之后,才能得到正确的傅里叶变换结果。因此,第一部分我想先列出几个...
  • 图像傅里叶变换

    2019-06-12 21:38:00
    简单说一下图像傅里叶变换的思路。 文章思路,先理解傅里叶级数,由连续傅里叶级数说明傅里叶变换。之后引入取样函数,连续函数取样,就可以得到离散函数的傅里叶变换。由此推倒出单变量傅里叶变换。由一维傅里叶...
  • 如果你对傅里叶变换到底是干嘛的不太熟悉,可参考:0704:傅里叶变换这里主要说一下傅里叶变换应用于图像处理,显示原图像的频谱图像.在Python中,实现傅里叶变换主要有两种方法,一种是使用numpy,一种是OpenCV.1...
  • 用MATLAB实现图像傅里叶变换
  • 在不同的研究领域,傅里叶变换具有多种不同的变体形式,如连续傅里叶变换和离散傅里叶变换。  傅立叶变换属于调和分析的内容。"分析"二字,可以解释为深入的研究。从字面上来看,"分析"二字,实际就是"条分缕析...
  • 知道怎么在图像进行傅里叶变换 了解傅里叶变换图像应用中的意义 知道在OPenCV中怎么实现傅里叶变换 了解频域滤波的分类 1 傅里叶变换的理解 傅里叶变换是由法国的一位数学家Joseph Fourier在...
  • 在Windows操作系统下的MATLAB2019b应用程序中编写程序,待程序调试完成后,通过选取两组图像分别进行傅里叶变换处理获取其相应的幅度谱和相位谱,并交换两幅图像的幅度谱和相位谱重构图像仿真实验来验证图像信号的...
  • 图像傅里叶变换的频谱特征 傅里叶变换在一维信号处理中的地位是显著的,是不可撼动的,然后傅里叶变换在图像处理领域中的应用似乎稍逊一筹,黯然失色。究其原因,我想了很久,请允许我用非官方的,不正规的,但...
  • 什么是傅里叶变换? 推荐一个极其优秀的知乎文章,看完它,比说什么都强。...傅里叶变换在opencv中实现图像去噪 代码演示: #include "stdafx.h" #include <opencv2\opencv.hpp> #include <iostream&g
  • Python+OpenCV实现图像傅里叶变换

    千次阅读 2019-05-07 23:04:38
    文章目录傅里叶变换numpy实现OpenCV实现逆傅里叶变换numpy实现OpenCV实现傅里叶变换滤波实例numpy实现傅里叶变换OpenCV实现傅里叶变换numpy实现逆傅里叶变换OpenCV实现逆傅里叶变换numpy实现高通滤波器OpenCV实现低...
  • 对于非数学专业的人来说,理解图像傅里叶变化真的是一件很困难的事情,刚开始满头雾水的我疯狂的在网上找文章,功夫不负有心人...图像经过基础的傅里叶变换得到的矩阵元素是复数类型,从复数矩阵中得到每个元素的...
  • 图像处理之傅里叶变换和小波变换

    千次阅读 2018-07-07 21:16:27
    最近在看物体识别论文摘要,好多论文中涉及到使用离散余弦傅里叶变换DFT(Discrete Fourier Transform)对图像进行处理,因此特地看了这部分的内容,傅里叶变换和小波变换。一、DFT的原理:以二维图像为例,归一化的...
  • 前言  前面转载过一篇关于傅里叶变换原理的文章《一篇难得的关于傅里叶分析的好文》。那篇文章写得非常棒,浅显易懂,可以说稍有基础的人...那么在数字图像处理中,傅里叶变换之后得到的频谱图又有怎样的运用呢?...
  • opencv学习(十五)之图像傅里叶变换dft

    万次阅读 多人点赞 2016-12-03 21:33:42
    我们知道傅里叶变换是把一个信号从时域变换到其对应的频域进行分析。如果有小伙伴还对傅里叶变换处于很迷糊的状态,请戳这里,非常通俗易懂。而在图像处理中也有傅里叶分析的概念,我这里给出在其官方指导文件opencv...
  • 本文对图像进行傅里叶变换、显示频谱、相位谱等操作;并且利用两幅图像,验证了频谱和相位谱的重要性,得出合适的结论。 一、实验目的和要求: 1、基本的图像操作 2、编程实现快速傅立叶变换和反变换,显示频谱和...
  •  这篇文章的主要目的是通过建立一维傅里叶变换图像傅里叶变换中相关概念的对应关系来帮助读者理解图像处理中的离散傅里叶变换,因此,理解图像中离散傅里叶变换的前提条件是读者需要了解一维傅里叶变换的基本知识...
  • 1.1、信号变化越快,说明频率越大,信号变化越慢,说明频率越小。...1.2、对于灰度图来说,先说它是怎么来的,我们真实的图像,比如一本书的封面,海报这些图像都是连续图像(模拟图像),当我们在计算机中看到的图
  • 傅里叶变换图像分解成其正弦和余弦分量,它将图像由空域转换为时域。任何函数都可以近似的表示为无数正弦和余弦函数的和,傅里叶变换就是实现这一步的,数学上一个二维图像傅里叶变换为:公式中,f是图像在空域...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,140
精华内容 1,656
关键字:

对图像进行傅里叶变换的目的