2007年8月27日 星期一

名詞s

1.最大差異值 MD(Mazimum Difference)
2.標準平均絕對差異 NAD (Normal Average Absolute Difference)
3.均方差 MSE(Mean Square Error)
4.標準化均方差 NMSE(Normal Mean Square Error)
5.訊號雜訊比 SNR (Signal to Noise Ratio)
6.峰值訊號雜訊比 PSNR(Peak Signal to Noise Ratio)
7.影像正確性 IF(Image Fidelity)

2007年8月21日 星期二

2007年8月14日 星期二

2007年7月29日 星期日

Files

專門放老師給我們的資料

JPEG 相關網站: [From老師的blog]
1. Joint Photographic Experts Group
2. 規格書 ITU 11505 T.81
3. Wikipedia: JPEG
4. 維基百科正體中文: JPEG

Papers:
1.Hide and Seek

程式區:
1.可欣學姊的程式
2.老師的JPEG程式

2007年7月26日 星期四

DCT-Interface







DCT-DrawYCbCr

int Ymin=0,Cbmin=0,Crmin=0,Ymax=0,Cbmax=0,Crmax=0;
for( i=0 ; i<Im1H ; i++ ){
  for( j=0 ; j<Im1W ; j++ )
  {
   if(Im1QuaY[i][j]<Ymin)
     Ymin=Im1QuaY[i][j];//Y min after DCT
   if(Im1QuaCb[i][j]<cbmin)
     Cbmin=Im1QuaCb[i][j];//Cb min after DCT
   if(Im1QuaCr[i][j]<Crmin)
     Crmin=Im1QuaCr[i][j]; //Cr min after DCT
   if(Im1QuaY[i][j]>Ymax)
     Ymax=Im1QuaY[i][j]; //Y max after DCT
   if(Im1QuaCb[i][j]>Cbmax)
     Cbmax=Im1QuaCb[i][j]; //Cb max after DCT
   if(Im1QuaCr[i][j]>Crmax)
     Crmax=Im1QuaCr[i][j]; //Cr max afterDCT  }}  
/******************************************************  
*求出Y,Cb,Cr最大最小值後,換算該範圍  
*用於調整長條圖的對稱性  
*******************************************************/
  if(Ymax>abs(Ymin)){
    DCTYrange=Ymax*2;
    YRange=Ymax;
  }
  else{
    DCTYrange=abs(Ymin)*2;
    YRange=abs(Ymin);
  }
  if(Cbmax>abs(Cbmax)){
    DCTCbrange=Cbmax*2;
    CbRange=Cbmax;
  }
  else{
    DCTCbrange=abs(Cbmin)*2;
    CbRange=abs(Cbmin);
  }
  if(Crmax>abs(Crmin)){
    DCTCrrange=Crmax*2;
    CrRange=Crmax;
  }
  else{
    DCTCrrange=abs(Crmin)*2;
    CrRange=abs(Crmin);
  }
  //DCTYrange = Ymax-Ymin;
  //DCTCbrange= Cbmax-Cbmin;
  //DCTCrrange= Crmax-Crmin;
  //↑要改一下....因為這樣左右不平衡....囧
  RecordY=new int[DCTYrange];
  RecordCb=new int[DCTCbrange];
  RecordCr=new int[DCTCrrange];
  for(i=0;i<DCTYrange;i++)
  RecordY[i]=0;
  for(i=0;i<DCTCbrange;i++)
  RecordCb[i]=0;
  for(i=0;i<DCTCrrange;i++)
  RecordCr[i]=0;
  //計算Histogram的高度
  for( i=0 ; i<Im1H; i++ )
  for( j=0 ; j<Im1W; j++ )
  {
    tempY=Im1QuaY[i][j] + YRange ;
    RecordY[ tempY ]++;
    tempCb=Im1QuaCb[i][j] + CbRange;
    RecordCb[ tempCb ]++;
    tempCr=Im1QuaCr[i][j] + CrRange;
    RecordCr[ tempCr ]++;
  }
  Ymax=0;Cbmax=0;Crmax=0;
  for( i=0 ; i<DCTYrange ; i++ )
  {
    if(RecordY[i]>Ymax)
    Ymax=RecordY[i];
  }
  for( i=0 ; i<DCTCbrange ; i++ )
  {
    if(RecordCb[i]>Cbmax)
    Cbmax=RecordCb[i];
  }
  for( i=0 ; i
  {
    if(RecordCr[i]>Crmax)
    Crmax=RecordCr[i];
  }
  Image5->Picture->Bitmap->Width= DCTYrange*2;
  Image5->Picture->Bitmap->Height=Ymax;
  Image5->Picture->Bitmap->PixelFormat=pf24bit;
  Image5->AutoSize=true;
  Image6->Picture->Bitmap->Width=DCTCbrange*2;
  Image6->Picture->Bitmap->Height=Cbmax;
  Image6->Picture->Bitmap->PixelFormat=pf24bit;
  Image6->AutoSize=true;

  Image7->Picture->Bitmap->Width=DCTCrrange*2;
  Image7->Picture->Bitmap->Height=Crmax;
  Image7->Picture->Bitmap->PixelFormat=pf24bit;
  Image7->AutoSize=true;
  for( i=0 ; i<DCTYrange ; i++ )
  {
    j=RecordY[i];
    k=Ymax;
    Image5->Canvas->MoveTo(i*2,k);
    Image5->Canvas->LineTo(i*2,k-j);
  }  for( i=0 ; i<DCTCbrange ; i++ )
  {
    j=RecordCb[i];
    k=Cbmax;
    Image6->Canvas->MoveTo(i*2,k);
    Image6->Canvas->LineTo(i*2,k-j);
  }
  for( i=0 ; i<DCTCrrange ; i++ )
  {
    j=RecordCr[i];
    k=Crmax;
    Image7->Canvas->MoveTo(i*2,k);
    Image7->Canvas->LineTo(i*2,k-j);
  }

DCT-OPEN

if(OpenPictureDialog1->Execute())
{
  Image1->Picture->LoadFromFile(OpenPictureDialog1->FileName);
}
  Image1->AutoSize=true;
  Im1H = Image1->Height;
  Im1W = Image1->Width;
  Image1->Picture->Bitmap->Width=Im1W;
  Image1->Picture->Bitmap->Height=Im1H;
  Image1->Picture->Bitmap->PixelFormat=pf24bit;
  Im1R=new int *[Im1H];
  Im1G=new int *[Im1H];
  Im1B=new int *[Im1H];
  Im1Y=new double *[Im1H];
  Im1Cb=new double *[Im1H];
  Im1Cr=new double *[Im1H];
  Im1DCTY=new double *[Im1H];
  Im1DCTCb=new double *[Im1H];
  Im1DCTCr=new double *[Im1H];
  Im1QuaY=new double *[Im1H];
  Im1QuaCb=new double *[Im1H];
  Im1QuaCr=new double *[Im1H];
  for( i=0; i<Im1H ; i++ )
  {
    Im1R[i]=new int[Im1W];
    Im1G[i]=new int[Im1W];
    Im1B[i]=new int[Im1W];
Im1Y[i]=new double[Im1W];
    Im1Cb[i]=new double[Im1W];
    Im1Cr[i]=new double[Im1W];
    Im1DCTY[i]= new double[Im1W];
    Im1DCTCb[i]= new double[Im1W];
    Im1DCTCr[i]= new double[Im1W];
    Im1QuaY[i]=new double [Im1W];
    Im1QuaCb[i]=new double [Im1W];
    Im1QuaCr[i]=new double [Im1W];
  }
  for( i=0 ; i  {
    ptr =(Byte *)Image1->Picture->Bitmap->ScanLine[i];
    for( j=0 ; j<Im1W; j++ )
    {
      Im1R[i][j]=(int)ptr[j*3+2];
      tempR=ptr[j*3+2];
      RecordR[tempR]++;
      //****************
      Im1G[i][j]=(int)ptr[j*3+1];
      tempG=ptr[j*3+1];
      RecordG[tempG]++;
      //****************
      Im1B[i][j]=(int)ptr[j*3];
      tempB=(int)ptr[j*3];
      RecordB[tempB]++;
      //=====Y,Cb,Cr分格線=====
      Im1Y[i][j]=0.2990*(double)tempR+0.5870*(double)tempG+0.1140*(double)tempB;
      Im1Cb[i][j]=0.1687*(double)tempR-0.3313*(double)tempG+0.5000*(double)tempB;
      Im1Cr[i][j]=0.5000*(double)tempR-0.4187*(double)tempG-0.0813*(double)tempB;
    }
  }