圖像二維整數(shù)離散余弦變換(dct)_變換算法和dsp實現(xiàn)課程設(shè)計_第1頁
已閱讀1頁,還剩11頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、<p><b>  課 程 設(shè) 計</b></p><p>  課程名稱 光電圖像處理綜合課程設(shè)計</p><p>  題目名稱 圖像二維整數(shù)離散余弦變換</p><p>  (DCT) 變換算法和DSP實現(xiàn)</p><p>  2013年11月26日</p><p><b>

2、  目錄</b></p><p>  一、離散余弦變換……………………………………………2</p><p><b>  1、概念</b></p><p>  2、離散余弦變換用于圖像處理</p><p><b>  3、量化</b></p><p>  二、流程圖

3、……………………………………………………5</p><p>  三、程序中實現(xiàn)………………………………………………6</p><p>  四、輸出結(jié)果…………………………………………………11</p><p><b>  一、離散余弦變換</b></p><p><b>  1、概念</b><

4、/p><p>  離散余弦變換(DCT for Discrete Cosine Transform)是與傅里葉變換相關(guān)的一種變換,它類似于離散傅里葉變換(DFT for Discrete Fourier Transform),但是只使用實數(shù)。離散余弦變換相當于一個長度大概是它兩倍的離散傅里葉變換,這個離散傅里葉變換是對一個實偶函數(shù)進行的(因為一個實偶函數(shù)的傅里葉變換仍然是一個實偶函數(shù)),在有些變形里面需要將輸入或者輸

5、出的位置移動半個單位(DCT有8種標準類型,其中4種是常見的)。</p><p>  最常用的一種離散余弦變換的類型是下面給出的第二種類型,通常我們所說的離散余弦變換指的就是這種。它的逆,也就是下面給出的第三種類型,通常相應(yīng)的被稱為"反離散余弦變換","逆離散余弦變換"或者"IDCT"。</p><p>  有兩個相關(guān)的變換,一個

6、是離散正弦變換(DST for Discrete Sine Transform),它相當于一個長度大概是它兩倍的實奇函數(shù)的離散傅里葉變換;另一個是改進的離散余弦變換(MDCT for Modified Discrete Cosine Transform),它相當于對交疊的數(shù)據(jù)進行離散余弦變換。</p><p>  離散余弦變換,尤其是它的第二種類型,經(jīng)常被信號處理和圖像處理使用,用于對信號和圖像(包括靜止圖像和運

7、動圖像)進行有損數(shù)據(jù)壓縮。這是由于離散余弦變換具有很強的"能量集中"特性:大多數(shù)的自然信號(包括聲音和圖像)的能量都集中在離散余弦變換后的低頻部分,而且當信號具有接近馬爾科夫過程(Markov processes)的統(tǒng)計特性時,離散余弦變換的去相關(guān)性接近于K-L變換(Karhunen-Loève 變換--它具有最優(yōu)的去相關(guān)性)的性能。</p><p>  2、離散余弦變換用于圖像處理

8、:</p><p>  圖像數(shù)據(jù)一般有較強的相關(guān)性,若所選用的正交矢量空間的基矢量與圖像本身的主要特征相近,在該正交矢量空間中描述圖像數(shù)據(jù)則會變得更簡單。 </p><p>  經(jīng)過正交變換,會把原來分散在原空間的圖像數(shù)據(jù)在新的坐標空間中得到集中。對于大多數(shù)圖像,大量變換系數(shù)很小,只要刪除接近于零的系數(shù),并且對較小的系數(shù)進行粗量化,而保留包含圖像主要信息的系數(shù),以此進行壓縮編碼。 <

9、/p><p>  在重建圖像進行解碼時,所損失的將是一些不重要的信息,幾乎不會引起圖像的失真。</p><p>  在變換編碼中,首先要將圖像數(shù)據(jù)分割成子圖像,然后對子圖像數(shù)據(jù)塊實施某種變換,如DCT變換,那么子圖像尺寸取多少好呢?根據(jù)實踐證明子圖像尺寸取4×4、8×8、16×16適合作圖像的壓縮,這是因為:</p><p>  <1

10、> 如果子圖像尺寸取得太小,雖然計算速度快,實現(xiàn)簡單,但壓縮能力有一定的限制。</p><p>  <2> 如果子圖像尺寸取得太大,雖然去相關(guān)效果變好,因為象DFT、DCT等正弦型變換均具有漸近最佳性,但也漸趨飽和。若尺寸太大,由于圖像本身的相關(guān)性很小,反而使其壓縮效果不顯示,而且增加了計算的復(fù)雜性。</p><p>  8*8FDCT和IDCT的普通算法如下:</

11、p><p><b>  其中:</b></p><p>  離散余弦變換(Discrete Cosine Tranform,簡稱DCT)是一種與傅立葉變換緊密相關(guān)的數(shù)學(xué)運算。在傅立葉級數(shù)展開式中,如果被展開的函數(shù)式是偶函數(shù),那么其傅立葉級數(shù)中只包含余弦項,再將其離散化可導(dǎo)出余弦變換,因此稱之為離散余弦變換。時間域中信號需要許多數(shù)據(jù)點表示;在x軸表示時間,在y軸表示幅度。信

12、號一旦用傅立葉變換轉(zhuǎn)換到頻率域,就只需要幾點就可以表示這個相同的信號。如我們已經(jīng)看到的那樣,原因就是信號只含有少量的頻率成分。這允許在頻率域中只用幾個數(shù)據(jù)點就可以表示信號,而在時間域中表示則需要大量數(shù)據(jù)點。</p><p>  這一技術(shù)可以應(yīng)用到彩色圖像上。彩色圖像有像素組成,這些像素具有RGB彩色值。每個像素都帶有x,y坐標,對每種原色使用8x8或者16x16矩陣。在灰度圖像中像素具有灰度值,它的x,y坐標由灰

13、色的幅度組成。為了在JPEG中壓縮灰度圖像,每個像素被翻譯為亮度或灰度值。為了壓縮RGB彩色圖像,這項工作必須進行三遍,因為JPEG分別得處理每個顏色成分,R成分第一個被壓縮,然后是G成分,最后是B成分。而一個8x8矩陣的64個值,每個值都帶有各自的x,y坐標,這樣我們就有了一個像素的三維表示法,稱作控件表達式或空間域。通過DCT變換,空間表達式就轉(zhuǎn)化為頻譜表達式或頻率域。從而到達了數(shù)據(jù)壓縮的目的。</p><p&g

14、t;  DCT式目前最佳的圖像變換,它有很多優(yōu)點。DCT是正交變換,它可以將8x8圖像空間表達式轉(zhuǎn)換為頻率域,只需要用少量的數(shù)據(jù)點表示圖像;DCT產(chǎn)生的系數(shù)很容易被量化,因此能獲得好的塊壓縮;DCT算法的性能很好,它有快速算法,如采用快速傅立葉變換可以進行高效的運算,因此它在硬件和軟件中都容易實現(xiàn);而且DCT算法是對稱的,所以利用逆DCT算法可以用來解壓縮圖像。</p><p>  為什么采用8x8的圖像塊,其原

15、因是由于計算量和像素之間關(guān)系的數(shù)量,許多研究表明,在15或20個像素之后,像素間的相關(guān)性開始下降。就是說,一列相似的像素通常會持續(xù)15到20個像素那么長,在此之后,像素就會改變幅度水平(或反向)。</p><p>  模擬圖像經(jīng)采樣后成為離散化的亮度值然后分成一個個宏塊,而一個宏塊有分成8x8大小的塊,可以用一個矩陣來表示這個塊。</p><p>  在這里,N=8,矩陣中元素f(i,j)

16、表示塊中第i行、第j列像素的亮度值。把該矩陣看作一個空間域,顯然,塊中這些亮度值的大小有一定的隨機性,無序性,或者說亮度值的分布沒有什么特征;DCT變換就是來解決這個問題的,把這些隨機的數(shù)據(jù)變的有序,便于對數(shù)據(jù)進行編碼壓縮。</p><p><b>  3、量化</b></p><p>  量化過程實際上就是對 DCT 系數(shù)的一個優(yōu)化過程。它是利用了人眼對高頻部分不敏

17、感的特性來實現(xiàn)數(shù)據(jù)的大幅簡化。</p><p>  量化過程實際上是簡單地把頻率領(lǐng)域上每個成份,除以一個對于該成份的常數(shù),且接著四舍五入取最接近的整數(shù)。</p><p>  這是整個過程中的主要有損運算。</p><p>  以這個結(jié)果來說,經(jīng)常會把很多高頻率的成份四舍五入而接近0,且剩下很多會變成小的正或負數(shù)。</p><p>  整個量化

18、的目的是減小非“0”系數(shù)的幅度以及增加“0”值系數(shù)的數(shù)目。</p><p>  量化是圖像質(zhì)量下降的最主要原因。</p><p>  因為人眼對亮度信號比對色差信號更敏感,因此使用了兩種量化表:亮度量化值和色差量化值。</p><p>  總體上來說,DCT 變換實際是空間域的低通濾波器。對 Y 分量采用細量化,對 UV 采用粗量化。</p><

19、p>  量化表是控制 JPEG 壓縮比的關(guān)鍵,這個步驟除掉了一些高頻量;另一個重要原因是所有圖片的點與點之間會有一個色彩過渡的過程,大量的圖像信息被包含在低頻率中,經(jīng)過量化處理后,在高頻率段,將出現(xiàn)大量連續(xù)的零。</p><p><b>  二、流程圖</b></p><p>  基于DCT的圖像壓縮編碼的程序?qū)崿F(xiàn)的流程圖如圖3-1所示。</p>

20、<p>  圖3-1 程序流程圖</p><p><b>  三、程序中實現(xiàn)</b></p><p>  /************************************************************************/</p><p><b>  /* 學(xué)號:</b></

21、p><p>  姓名: */</p><p>  /************************************************************************/</p><p>  #include <stdio.h>

22、</p><p>  #include <math.h></p><p>  #define N 8</p><p>  #define PI 3.1415926</p><p>  int f1[N][N]=</p><p><b>  {</b></p><p&

23、gt;  {139,144,149,153,155,155,155,155},</p><p>  {144,151,153,156,159,156,156,156},</p><p>  {150,155,160,163,158,156,156,156},</p><p>  {159,161,162,160,160,159,159,159},</p>

24、<p>  {159,160,161,162,162,155,155,155},</p><p>  {161,161,161,161,160,157,157,157},</p><p>  {162,162,161,163,162,157,157,157},</p><p>  {162,162,161,161,163,158,158,158},&l

25、t;/p><p><b>  };</b></p><p>  int q1[N][N]=//定義色度量化系數(shù)</p><p><b>  {</b></p><p>  {17,18,24,47,99,99,99,99}, </p><p>  {18,21

26、,26,66,99,99,99,99}, </p><p>  {24,26,56,99,99,99,99,99}, </p><p>  {47,66,99,99,99,99,99,99}, </p><p>  {99,99,99,99,99,99,99,99}, </p><p>  {99,99,99,99,99,99,99,9

27、9}, </p><p>  {99,99,99,99,99,99,99,99}, </p><p>  {99,99,99,99,99,99,99,99},</p><p><b>  };</b></p><p>  int q2[N][N]=//定義亮度量化系數(shù)</p>&

28、lt;p><b>  {</b></p><p>  {16,11,10,16,24,40,51,61},</p><p>  {12,12,14,19,26,58,60,55},</p><p>  {14,13,16,24,40,57,69,56},</p><p>  {14,17,22,29,51,87,8

29、0,62},</p><p>  {18,22,37,56,68,109,103,77},</p><p>  {24,35,55,64,81,104,113,92},</p><p>  {49,64,78,87,103,121,120,101},</p><p>  {72,92,95,98,112,100,103,99}</p&

30、gt;<p><b>  };</b></p><p>  void showMat_d(double **matShow);</p><p>  void showMat_i(int **matShow);//顯示函數(shù),輸出為整形數(shù)據(jù)</p><p>  void DCT(int **f,double **F);

31、//經(jīng)過FDCT變換,f為輸入數(shù)據(jù),F(xiàn)為輸出數(shù)據(jù)</p><p>  void IDCT(int **f,int **F);//經(jīng)過逆變換,f為輸入數(shù)據(jù),F(xiàn)為輸出數(shù)據(jù)</p><p>  void quant(double **f,int **F);//量化過程,f為傳進的DCT數(shù)據(jù),F(xiàn)為量化后的數(shù)據(jù)</p><p>  void iQuant(

32、int **f,int **F);//逆量化過程,f為量化后的數(shù)據(jù),F(xiàn)為消除了量化的數(shù)據(jù)</p><p>  void main()</p><p><b>  {</b></p><p>  double F[N][N]={0};//初始化輸出數(shù)組</p><p>  int f_1[N][N]={

33、0};//初始化逆變換的輸出數(shù)組</p><p>  int f2[N][N]={0};//自定義輸入數(shù)組的數(shù)據(jù)</p><p>  int fq[N][N]={0};//定義量化后的數(shù)組。</p><p>  int fq_1[N][N]={0};//定義經(jīng)過逆變化后的數(shù)組</p><p> 

34、 int i=0,j=0;</p><p>  //////////////////////////////////////////////////////////////////////////</p><p>  printf("輸入數(shù)據(jù)f(x,y)為:\n");</p><p>  showMat_i((int **)f1);//輸

35、出原始數(shù)據(jù)</p><p>  for(i=0;i<N;i++)</p><p>  for(j=0;j<N;j++)</p><p>  f1[i][j]-=128;//減128</p><p>  printf("\nDCT之后,數(shù)據(jù)F(u,v)為:\n");</p><p&g

36、t;  DCT((int **)f1,(double **)F);//DCT變換</p><p>  showMat_d((double **)F);//輸出DCT數(shù)據(jù)</p><p>  quant((double **)F,(int **)fq);//量化</p><p>  printf("\n量化后的DCT為:\n");&l

37、t;/p><p>  showMat_i((int **)fq);//輸出量化后的DCT數(shù)據(jù)</p><p>  iQuant((int **)fq,(int **)fq_1);//經(jīng)過逆量化處理</p><p>  printf("\n逆量化后的數(shù)為:\n");</p><p>  showMat_i((int *

38、*)fq_1);</p><p>  printf("\nIDCT之后,數(shù)據(jù)f'(x,y)為:\n");</p><p>  IDCT((int **)fq_1,(int **)f_1);//IDCT變換</p><p>  for(i=0;i<N;i++)</p><p>  for(j=0;j<

39、N;j++)</p><p>  f_1[i][j]+=128;//加128</p><p>  showMat_i((int **)f_1);//輸出數(shù)據(jù)</p><p>  //////////////////////////////////////////////////////////////////////////</p>&

40、lt;p><b>  }</b></p><p>  void showMat_d(double **matShow)</p><p><b>  {</b></p><p><b>  int i=0;</b></p><p><b>  int j=0;&l

41、t;/b></p><p>  for(i=0;i<N;i++)</p><p><b>  {</b></p><p>  for(j=0;j<N;j++)</p><p><b>  {</b></p><p>  printf("%5.1f

42、",((*((double*)matShow+i*N+j))));</p><p><b>  }</b></p><p>  printf("\n");</p><p><b>  }</b></p><p><b>  }</b></p&

43、gt;<p>  void showMat_i(int **matShow)</p><p><b>  {</b></p><p><b>  int i=0;</b></p><p><b>  int j=0;</b></p><p>  for(i=0;i

44、<N;i++)</p><p><b>  {</b></p><p>  for(j=0;j<N;j++)</p><p><b>  {</b></p><p>  printf("%3d ",((*((int*)matShow+i*N+j))));</p&

45、gt;<p><b>  }</b></p><p>  printf("\n");</p><p><b>  }</b></p><p><b>  }</b></p><p>  void quant(double **f,int **F

46、)</p><p><b>  {</b></p><p><b>  int i=0;</b></p><p><b>  int j=0;</b></p><p>  double temp[N][N]={0.0};</p><p>  for (i

47、=0;i<N;i++)</p><p>  for(j=0;j<N;j++)</p><p><b>  {</b></p><p>  *((double*)temp+i*N+j)=(*((double*)f+i*N+j)/((*((int*)q2+i*N+j))));</p><p>  if (((*(

48、(double*)temp+i*N+j))<0))</p><p><b>  {</b></p><p>  *((int*)F+i*N+j)=(int)((*((double*)temp+i*N+j))-0.5);//-0.5為四舍五入取整</p><p><b>  }</b></p><

49、;p><b>  else</b></p><p>  *((int*)F+i*N+j)=(int)((*((double*)temp+i*N+j))+0.5);//+0.5為四舍五入取整</p><p><b>  }</b></p><p><b>  }</b></p>

50、<p>  void iQuant(int **f,int **F)</p><p><b>  {</b></p><p><b>  int i=0;</b></p><p><b>  int j=0;</b></p><p>  double temp[N][

51、N]={0.0};</p><p>  for (i=0;i<N;i++)</p><p>  for(j=0;j<N;j++)</p><p><b>  {</b></p><p>  *((double*)temp+i*N+j)=(double)*((int*)f+i*N+j)*(*((int*)q2+

52、i*N+j));</p><p>  if (((*((double*)temp+i*N+j))<0))</p><p><b>  {</b></p><p>  *((int*)F+i*N+j)=(int)((*((double*)temp+i*N+j))-0.5);//-0.5為四舍五入取整</p><p&g

53、t;<b>  }</b></p><p><b>  else</b></p><p>  *((int*)F+i*N+j)=(int)((*((double*)temp+i*N+j))+0.5);//+0.5為四舍五入取整</p><p><b>  }</b></p><

54、p><b>  }</b></p><p>  void DCT(int **f,double **F)//DCT轉(zhuǎn)換</p><p><b>  {</b></p><p>  int x,m,n;</p><p>  double dTemp[N][N] = {0.0};//

55、中間矩陣</p><p>  double temp[N][N]={0.0};</p><p>  double coff[N] = {0.0};//變換系數(shù)</p><p>  coff[0] = 1/sqrt(N);</p><p>  for (m=1;m<N;m++)</p><p><b&

56、gt;  {</b></p><p>  coff[m]=sqrt(2)/sqrt(N);</p><p><b>  }</b></p><p>  //一維變換,,,,對列進行一維DCT變換。</p><p>  for(n=0;n<N;n++)//每一列遍歷</p><

57、;p>  for(m=0;m<N;m++)//每一行遍歷</p><p>  for(x=0;x<N;x++)//每個cos系數(shù)遍歷</p><p>  (*((double*)temp+m*N+n))+=(double)(*((int*)f+x*N+n))*coff[m]*cos((2*x+1)*PI*m/(2*N));</p><p&

58、gt;  //二維變換,,對行進行以為DCT變換</p><p>  for (m=0;m<N;m++)//每一行遍歷</p><p>  for(n=0;n<N;n++)//每一列遍歷</p><p>  for(x=0;x<N;x++)//每個cos系數(shù)遍歷(*((double*)F+m*N+n))+=(*((dou

59、ble*)temp+m*N+x))*coff[n]*cos((2*x+1)*PI*n/(2*N));</p><p><b>  }</b></p><p>  void IDCT(int **f,int **F)//逆變換</p><p><b>  {</b></p><p>  i

60、nt y,m,x;</p><p>  double dTemp[N][N] = {0.0};//中間矩陣</p><p>  double temp[N][N] ={0.0};</p><p>  double coff[N] = {0.0};//變換系數(shù)</p><p>  coff[0] = 1.0/sqrt(N);<

61、;/p><p>  for (m=1;m<N;m++)</p><p><b>  {</b></p><p>  coff[m]=sqrt(2)/sqrt(N);</p><p><b>  }</b></p><p><b>  //一維變換</b>

62、;</p><p>  for(x=0;x<N;x++)</p><p>  for(y=0;y<N;y++)</p><p>  for(m=0;m<N;m++)</p><p>  (*((double*)temp+x*N+y))+=(*((int*)f+x*N+m))*coff[m]*cos((2*y+1

63、)*PI*m/(2*N));</p><p><b>  //二維變換</b></p><p>  for (y=0;y<N;y++)</p><p>  for(x=0;x<N;x++)</p><p><b>  {</b></p><p> 

64、 for(m=0;m<N;m++)</p><p>  (*((double*)dTemp+x*N+y))+=(*((double*)temp+m*N+y))*coff[m]*cos((2*x+1)*PI*m/(2*N));</p><p>  if ((*((double*)dTemp+x*N+y))<0)</p><p><b>  {

65、</b></p><p>  (*((int*)F+x*N+y))=(int)((*((double*)dTemp+x*N+y))-0.5);//-0.5為四舍五入取整</p><p><b>  }</b></p><p><b>  else</b></p><p>  (*((in

66、t*)F+x*N+y))=(int)((*((double*)dTemp+x*N+y))+0.5);//+0.5為四舍五入取整</p><p><b>  }</b></p><p><b>  四、輸出結(jié)果</b></p><p><b>  亮度量化輸出結(jié)果:</b></p><

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論