《OpenCV3编程入门》——5.5.2 离散傅里叶变换相关函数详解

目录

1、dft()函数

2、返回DFT最优尺寸大小:getOptimalDFTSize()函数

3、扩充图像边界:copyMakeBorder()函数

4、计算二维矢量的幅值:magnitude()函数

6、矩阵归一化:normalize()函数


1、dft()函数

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

函数格式:

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

参数说明:

第一个参数,InputArray src,输入矩阵,可以为实数或者虚数

第二个参数,OutputArray dst,函数调用后的结果存储在这里,其尺寸和类型取决于标识符,即第三个参数flags

第三个参数,int flags,转换的标识符,有默认值0,取值可以为表6.1中标识符的结合

第四个参数,int nonzeroRows,默认值0。当此参数设为非零时(最好是取值为想要处理的那一行的值,比如C.rows),函数会假设只有输入矩阵的第一个非零行包含非零元素(没有设置DFT_INVERSE标识符),或只有输出矩阵的第一个非零行包含非零元素(设置了DFT_INVERSE标识符)。这样函数就可以对其他进行高效的处理,以节省时间开销。


2、返回DFT最优尺寸大小:getOptimalDFTSize()函数

getOptimalDFTSize()函数返回给定向量尺寸的傅里叶最优尺寸大小。因为当图像的尺寸是2、3、5的倍数时,计算速度最快。因此为了提高离散傅里叶变换的运行速度,需要扩充图像,具体扩充多少由此函数计算。

函数格式:

int getOptimalDFTSize(int vecsize)

参数说明:

int vecsize,向量尺寸,即图片的rows、cols


3、扩充图像边界:copyMakeBorder()函数

copyMakeBorder()函数能够扩充图像边界

函数格式:

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

参数说明:

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

第二个参数,OutputArray dst,函数调用后的结果存储在这里,需要和源图像有一样的尺寸和类型,且size应该为Size(src.cols+left+right, src.rows+top+bottom)

接下来的4个参数分别为int top,int bottom,int left,int right,分别表示在源图像上各扩充多少个像素,如top=2,bottom=2,left=2,right=2表示在源图像上的上下左右各扩充两个像素宽度的边界。

第七个参数,borderType,边界类型,常见取值为BORDER_CONSTANT

第八个参数,const Scalar& value,有默认值Scalar(),可以理解为默认值为0。当borderType取值为BORDER_CONSTANT这个参数表示边界值。 


4、计算二维矢量的幅值:magnitude()函数

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

函数格式:

void magnitude(InputArray x, InputArray y, OutputArray magnitude)

参数说明:

第一个参数,InputArray x,表示矢量的浮点型X坐标值,即实部

第二个参数,InputArray y,表示矢量的浮点型Y坐标值,即虚部

第三个参数,OutputArray magnitude,输出幅度值,和第一个参数x有着一样的尺寸和类型

magnitude()函数原理:

                                                                          dst(I)=\sqrt{x(I)^{2}+y(I)^{2}}


5、计算自然对数:log()函数

傅里叶变换的幅度范围大道不适合在屏幕上显示。高值在屏幕上显示为白点,低值为黑点,高低值的变化无法有效分辨。为了在屏幕上凸显出高低变化的连续性,可以用对数尺度类替换线性尺度,公式如下:

                                                                                  M_{1}=log(1+M)

log()函数的功能是计算每个数组元素绝对值的自然对数

函数格式:

void log(InputArray src, OutputArray dst)

参数说明:

第一个参数,InputArray src,输入图像

第二个参数,OutputArray dst,输出图像,得到的绝对值

log()函数原理如下:

                                                                \texttt{dst} (I) =  \fork{\log |\texttt{src}(I)|}{if $\texttt{src}(I) \ne 0$ }{\texttt{C}}{otherwise}

C是一个很大的负数


6、矩阵归一化:normalize()函数

函数格式:

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

参数说明:

第一个参数,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()

猜你喜欢

转载自blog.csdn.net/Sophia_11/article/details/84933431