全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:3206
推到 Plurk!
推到 Facebook!

一段DCT程式碼

尚未結案
pork
一般會員


發表:15
回覆:13
積分:5
註冊:2003-10-25

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-11-24 07:04:13 IP:220.141.xxx.xxx 未訂閱
大家好 我寫了一段DCT的程式碼 但是結果秀不出來 不知道問題在哪 煩請幫忙 謝謝 
 #include 
#pragma hdrstop    #include "Unit1.h"
#include <math.h>
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
int pixel_value[512][512];
int dct_value[512][512];
//int pixel_value[8][8];
int dct1_value[8][8];
float pi=3.14159;    TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------    void __fastcall TForm1::BitBtn1Click(TObject *Sender)
{
        Graphics::TBitmap *Bmp1=new Graphics::TBitmap();
        Graphics::TBitmap *Bmp2=new Graphics::TBitmap();
        Image1->Picture->Bitmap->LoadFromFile("lena.bmp");
        Bmp1->Assign(Image1->Picture->Bitmap);
        Bmp2->Assign(Image1->Picture->Bitmap);    for(int countx=0;countxWidth;countx =8)
for(int county=0;countyHeight;county =8)
{
        double d_value=0.0;
         double ci,cj;            for(int i=0;iWidth;i  )
        for(int j=0;jHeight;j  )
        {
                double temp=0.0;
                        double block_sum=0.0;
                for(int x=0;x<8;x  )
                for(int y=0;y<8;y  )
                {
                        
                        int value=0;
                        value=GetRValue(Bmp1->Canvas->Pixels[countx x][county y])-128;
                        pixel_value[countx x][county y]=value;
                        temp=value*cos( (2*(countx x) 1)*i*pi/16)*cos( (2*(county y) 1)*j*pi/16);
                        block_sum =temp;                    }                    if(i==0)
                        ci=(1/sqrt(2));
                else
                        ci=1;
                if(j==0)
                        cj=(1/sqrt(2));
                else
                        cj=1;                     d_value=block_sum*ci*cj/4;
                dct_value[i][j]=d_value;                }      }
}
pork
一般會員


發表:15
回覆:13
積分:5
註冊:2003-10-25

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-11-27 19:54:07 IP:220.141.xxx.xxx 未訂閱
大家好 下面是我寫的DCT轉換和逆轉換程式碼 雖然跑的出來但是速度很慢 不知有沒有方法可以讓它快一些 謝謝 pork上    
void __fastcall TForm1::BitBtn1Click(TObject *Sender)
{
        Graphics::TBitmap *Bmp1=new Graphics::TBitmap();
        Graphics::TBitmap *Bmp2=new Graphics::TBitmap();
        Graphics::TBitmap *Bmp3=new Graphics::TBitmap();            Image1->Picture->Bitmap->LoadFromFile("lena256.bmp");
        Bmp1->Assign(Image1->Picture->Bitmap);
        Bmp2->Assign(Image1->Picture->Bitmap);
        Bmp3->Assign(Image1->Picture->Bitmap);            //Idct transform
        for(int countx=0;countxWidth;countx =8)
        for(int county=0;countyHeight;county =8)
        {
                for( int i=countx;i<(countx 8);i  )
                for( int j=county;j<(county 8);j  )                    {
                        double temp=0.0;
                        double block_sum=0.0;                            for(int x=0;x<8;x  )
                        for(int y=0;y<8;y  )
                        {
                                int value=0;
                                value=GetRValue(Bmp1->Canvas->Pixels[countx x][county y]);
                                pixel_value[countx x][county y]=value;
                                temp=value*cos( (2*(countx x) 1)*i*pi/16)*cos( (2*(county y) 1)*j*pi/16);
                                block_sum =temp;                            }
                 double d_value=0.0;
                double ci,cj;                    if(i!=0)
                        ci=1;
                else
                          ci=(1/sqrt(2));
                if(j!=0)
                        cj=1;
                else
                         cj=(1/sqrt(2));                       d_value=block_sum*ci*cj/4;
                   dct_value[i][j]=d_value;                 }
        }   //Idct transform
        double  Idct_block_sum;
        int i,j;            for(int countx=0;countxWidth;countx =8)
        for(int county=0;countyHeight;county =8)
        {                    for(int x=countx;x<(countx 8);x  )
                for(int y=county;y<(county 8);y  )
                {
                        for( i=0;i<8;i  )
                        for( j=0;j<8;j  )
                        {
                                double  Idct_temp=0.0;
                                double ci,cj;
                                 Idct_block_sum=0.0;
                                if((countx i)!=0)
                                ci=1;
                                else
                                ci=(1/sqrt(2));
                                if((county j)!=0)
                                cj=1;
                                else
                                cj=(1/sqrt(2));
                                Idct_temp=ci*cj*dct_value[countx i][county j]*
                                  cos((2*x 1)*i*pi/16)*
                                  cos((2*y 1)*j*pi/16);
                                Idct_block_sum =Idct_temp;                              }                             pixel_i_value[x][y]=Idct_block_sum/4;
                         Bmp2->Canvas->Pixels[i][j]=(TColor)pixel_i_value[x][y];
                }                }
       Image2->Picture->Bitmap->Assign(Bmp2);  
culita
一般會員


發表:1
回覆:4
積分:1
註冊:2006-11-21

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-01-11 11:08:21 IP:134.208.xxx.xxx 訂閱
我知道 你因該已經做完了...
不過給後來的參考一下
因該是 這邊有問題 :
for( int i=countx;i<(countx 8);i )

for( int j=county;j<(county 8);j )



改成 i<8j < 8 才對 , 不然 隨著 上面的count 增加 妳不只 做 64次 , 而是做了xxxx次.... 自己拿計算機 算
系統時間:2024-05-05 21:19:05
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!