python离散余弦变换(快速傅里叶变换的意义)

图像的正交变换在数字图像处理和分析中起着重要的作用,广泛应用于图像增强、去噪、压缩编码等领域。本文通过手工实现二维离散傅里叶变换和二维离散余弦变换算法,并在几个图像样本上进行测试,探索其变换效果。

1.傅里叶变换实验原理:对图像进行离散傅里叶变换(DFT)可以得到图像信号的傅里叶频谱。二维DFT变换和逆变换公式如下:

DFT虽然解决了频域离散化的问题,但是计算量太大。从公式中可以看出,有两个嵌套的求和符号,显然直接计算的复杂度是\ (O (n 2) \)。为了加快傅里叶变换的运算速度,后人提出了快速傅里叶变换,即蝶形算法,将DFT计算的复杂度降低到\(O(n\log n)\)。利用FFT的数学性质和分治的思想,将一个N点的FFT变换为两个N/2点的FFT变换。以一维FFT为例,可以表示如下:

其中\(G(k)\)是\(x(k)\)的偶数点的\(N/2\)的FFT,而\(H(k)\)是\(x(k)\)的奇数点的\(N/2\)这样,通过将原问题连续分解为两个半尺度子问题,然后计算相应的蝶形运算单元,最终可以完成整个FFT。

本实验步骤,一维FFT递归实现,只支持长度为2的整数次幂。算法步骤如下:

检查图像的大小,如果不是2的整数次方就直接退出。图像的灰度值被归一化。对图像的每一行进行一维FFT,保存为中间结果。对上一步结果中的每一列进行一维FFT,返回变换结果。将零频率分量移动到频谱的中心,并找到绝对值以便可视化。对集中后的结果进行对数变换,以改善视觉效果。主代码一维FFT def FFT(X):n=len(X)if n==2:return[X[0]X[1],X[0]-X[1]]G=FFT(X[:2])H=FFT(X[1:2])W=NP . exp(-2j * NP . pi * NP . arange(n//2)/n)WH=W * H X=NP . concatenate([G WH,G-WH]) return X 2d FFTdef fft2(img complex 128 ')for I in range(h):RES[I,]=fft(img[i,)for j in range(w): res[:j]=fft(res[:J]) return res零频分量中心化Def FFT Shift (IMG): #交换第一和第三象限以及第二和第四象限h,w=img.shapeh _ mid,w_mid=h//2,w//2 res=np.zeros([h,w],' complex 128 ')RES[:h _ h :w _ mid]RES[h _ mid:w _ mid]=img[:h _ mid,w _ mid:] RES [h _ mid:w _ mid:]=img [:h _ mid,w _ mid] RETURN RES运行结果2 . 余弦变换作为函数的实验原理离散余弦变换(DCT)的变换核是实数的余弦函数,因此计算速度比变换核为指数型的DFT快得多。一维离散余弦变换类似于离散傅立叶变换,因此对离散傅立叶变换修改以下公式:

中中

从上式可以看出\(\ sum \ limits _ { x=0 } { 2m-1 } f _ e(x)e { \ frac {-J2ux \ pi } { 2m } } \)是\(2M\)点的傅里叶变换,所以在做离散余弦变换时。

算法步骤基于上述原理,2D DCT的实现复用了上述文本中的一维FFT函数,并根据公式做了一些修改。算法步骤如下:

检查图像的大小,如果不是2的整数次方就直接退出。图像的灰度值被归一化。对图像的每一行进行延拓,一维FFT后取实部,乘以公式中的系数,保存为中间结果。对上一步结果中的每一列进行扩展,一维FFT后取实部,乘以公式中的系数,返回变换结果。求结果的绝对值,进行对数变换,改善视觉效果。主代码二维DCTdef dct2(img): h,w=img.shape if ((h-1) h)或((w-1) w): print('图像大小不是2的幂')return img img=normalize(img)RES=NP . zeros([h,w],' complex 128 ')for I in range(h):RES[I,]=fft(np.concatenate([img[i,NP . zeros(w))[:w]RES[I,]

其他教程

excel如何批量删除多列(如何批量清除word表格中的内容)

2023-1-17 12:31:01

其他教程

飞手来了:电影航拍设备有多贵?相当于一台宝马X5天上飞

2023-1-17 12:33:05

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索