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

2021-09-07 12:50:50 字數 1908 閱讀 7131

寫在前面

到目前為止已經閱讀了相當一部分的網格水印等方面的**了,但是**的實現進度還沒有更上,這個月準備挑選一些較為經典的**,將其中的演算法實現。在實現**的過程中,發現**中有用到一些空域轉頻率域的演算法。因此也就想到了實現一下離散余弦變換。雖然本文的**和網上很多已有的**很類似,思路都沒有太多的差別,但是本文有乙個比較重要的改進。具體的說,網上現有dct演算法輸入的是乙個固定的二維陣列。當二維陣列作為函式引數進行傳遞時,至少需要給出第二個維度的大小,否則編譯器會報錯。但是在圖形影象處理中,當我們希望使用dct變換把某個圖形或者影象轉換到頻域時,可能我在呼叫dct函式之前事先並不知道圖形或者影象的規模,因此這種傳參方式較大限制了**的使用。本文的乙個改進就是,dct函式的引數不再是二維陣列,而是傳入乙個二維指標,通過手動定址來實現函式功能。

離散余弦變換理論基礎

反變換表示如下:

**實現

根據上面的公式,很容易就能寫出**

// dct - discrete cosine transform

void dct( double ** input, double ** output, int row, int col ) else if(v == 0) else double tmp = 0.0; for(i = 0; i < row; i++) } *((double*) output + col*u + v) = alpha * beta * tmp; } } cout << "the result of dct:" << endl; for(int m = 0; m < row; m++) cout << endl; } }

注意**中的函式引數不是二維陣列,而是乙個指向二維陣列的指標。相應的反變換的**如下:

// inverse dct

void idct( double ** input, double ** output, int row, int col )

else if(v == 0) else tmp += alpha * beta * *((double*) input + col*u + v )* cos((2*i+1)*u*pi/(2.0 * row)) * cos((2*j+1)*v*pi/(2.0 * col)); } } *((double*) output + col*i + j) = tmp; } } cout << "the result of idct:" << endl; for(int m = 0; m < row; m++) cout << endl; } }

測試**

#include #include #include#include #includeusing namespace std; #define pi 3.1415926 int main() , , , }; double outputdata[rows][cols]; dct( (double**)inputdata, (double**)outputdata,rows, cols ); idct( (double**)outputdata, (double**)inputdata,rows,cols ); system("pause"); return 0; } 

程式執行結果如下:

小結之後可以對**進行公升級,不再使用二維陣列作為引數傳遞,而是使用eigen型別作為引數,這樣**更加清晰,並且記憶體管理等方面也更加方便。

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

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

離散余弦變換 C 實現

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

Matlab中二維離散傅利葉變換

fft是快速傅利葉變換 中值濾波的理解 還有一種非線性濾波 中值濾波器。中值濾波器對脈衝型雜訊有很好的去掉。因為脈衝點都是突變的點,排序以後輸出中值,那麼那些最大點和最小點就可以去掉了。中值濾波對高斯噪音效果較差。常見的影象增強方法有對比度拉伸,直方圖均衡化,影象銳化等。前面兩個是在空域進行基於畫素...