傅里叶变换
最近看了《数字图像处理》的书,一直纠结于傅里叶变换,因为没有人指导,所以看了好久才明白原理,写出代码。
傅里叶变化在数字图像处理中经常用到,把图像从空域变换到频域进行处理。并且根据傅里叶变换的性质不难得二维的傅里叶变换具有可分离性,可以通过对两个维度分别做傅里叶变换而得到,也就是说只要写出一维下的变换就可以了。
一下是一维傅里叶变换的核心代码,很简单:
// 一维离散傅里叶变换 //sv : variable in spatial domain //fv : variable in frequency domain template void DFT_1D(const vector &sv, vector &fv) { assert(fv.size() == sv.size()); for (size_t i = 0; i < fv.size(); i++) { for (size_t j =0; j < sv.size(); j++) { fv.at(i) += sv.at(j) * exp(T(0, -2*PI*i*j/fv.size())); } } }一维傅里叶变化的逆变换:
// 一维离散傅里叶逆变换 template void IDFT_1D(const vector &fv, vector &sv) { assert(fv.size() == sv.size()); for (size_t i = 0; i < sv.size(); i++) { for (size_t j =0; j < fv.size(); j++) { sv.at(i) += fv.at(j) * (exp(T(0, 2.*PI*i*j/fv.size())) / T(sv.size(), 0)); } } }