C 實現離散余弦變換(引數為Eigen矩陣)

2022-08-05 05:39:14 字數 1749 閱讀 4482

問題描述

昨天寫了乙個引數為二維指標為引數的離散余弦變換,雖然改進了引數為二維陣列時,當陣列大小不確定時宣告函式時帶來的困難,但使用指標作為引數也存在一些不足之處,比如需要手動定址、容易出現指標越界等。因此這篇文章中的**對昨天的**做了進一步的改進,將函式的引數設定為eigen矩陣,很好的避免了上述問題。

dct**的主體跟之前的**沒啥差別,主要就是改變了函式的引數型別

// dct - discrete cosine transform

void dct( matrixxd &input, matrixxd &output )

else

if(v == 0)

else

double tmp = 0.0;

for(i = 0; i < row; i++)

}output(u,v) = alpha * beta * tmp;}}

cout << "the result of dct:"

<< endl;

for(int m = 0; m

< row; m++)

cout << endl;}}

注意比較上述eigen陣列的訪問方法。訪問eigen矩陣的i行j列元素是,使用的是(i,j)

idct**

// inverse dct

void idct( matrixxd &input, matrixxd &output )

else

if(v == 0)

else

tmp += alpha * beta * input(u,v)* cos((2*i+1)*u*pi/(2.0 * row)) * cos((2*j+1)*v*pi/(2.0 * col));}}

output(i,j)= tmp;}}

cout << "the result of idct:"

<< endl;

for(int m = 0; m

< row; m++)

cout << endl;}}

測試**

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

using

namespace eigen;

#define pi 3.1415926

intmain(),,,

,};double outputdata[rows][cols];

matrixxd minput;

matrixxd moutput;

minput.setzero(4,2);

moutput.setzero(4,2);

for (int i = 0; i < minput.rows(); i++)

}dct( minput, moutput );

idct(moutput, minput);

system("pause");

return

0;}

執行結果

離散余弦變換 C 實現

理論 影象處理中常用的正交變換除了傅利葉變換外,還有其他一些有用的正交變換,其中離散余弦就是一種。離散余弦變換表示為dct discrete cosine transformation 常用於影象處理和影象識別等。2 式中f u 是第u個余弦變換係數,u是廣義頻率變數,u 1,2,3.n 1 f x...

C 實現離散余弦變換(引數為二維指標)

寫在前面 到目前為止已經閱讀了相當一部分的網格水印等方面的 了,但是 的實現進度還沒有更上,這個月準備挑選一些較為經典的 將其中的演算法實現。在實現 的過程中,發現 中有用到一些空域轉頻率域的演算法。因此也就想到了實現一下離散余弦變換。雖然本文的 和網上很多已有的 很類似,思路都沒有太多的差別,但是...

opencv3 C 離散余弦變換DCT

離散余弦變換 discrete cosine transform,根據離散傅利葉變換的性質,實偶函式的傅利葉變換只含實的余弦項,而數字影象都是實數矩陣,因此構造了一種實數域的變換 離散余弦變換 dct 離散余弦變換具有很強的 能量集中 特性,左上方稱為低頻資料,右下方稱為高頻資料。而大多數的自然訊號...