顯示具有 work 標籤的文章。 顯示所有文章
顯示具有 work 標籤的文章。 顯示所有文章

2007年7月26日 星期四

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;
    }
  }

DCT Code (參考學姊,略為修改)

void DCT(int DCTW,int DCTH)
{
  for(u = 0;u < v =" 0;v" dbtemp1 =" 0;" dbtemp2 =" 0;" dbtemp3 =" 0;" u ="="" cu =" (double)1/"> 0)
        Cu = 1;
      if(v == 0)
        Cv = (double)1/ sqrt(2);
      else if(v > 0)
        Cv = 1;
      for(i = 0;i < 8;i++)
      {
        for(j = 0;j < 8;j++)
        {
          dbTemp1 += (Im1Y[DCTH+i][DCTW + j]-128) * cos((2*i+1) * u * M_PI/16) * cos((2*j+1) * v * M_PI/16);
          dbTemp2 += (Im1Cb[DCTH+i][DCTW + j]-128) * cos((2*i+1) * u * M_PI/16) * cos((2*j+1) * v * M_PI/16);
          dbTemp3 += (Im1Cr[DCTH+i][DCTW + j]-128) * cos((2*i+1) * u * M_PI/16) * cos((2*j+1) * v * M_PI/16);
        }
      }
//陣列還沒改變需要更改
      Im1DCTY[DCTH+u][DCTW+v] = (Cu * Cv * dbTemp1)/(double)4;
      Im1DCTCb[DCTH+u][DCTW+v] = (Cu * Cv * dbTemp2)/(double)4;
      Im1DCTCr[DCTH+u][DCTW+v] = (Cu * Cv * dbTemp3)/(double)4;

      Im1QuaY[DCTH+u][DCTW+v]= Im1DCTY[DCTH+u][DCTW+v]/YQT[u][v];
      Im1QuaCb[DCTH+u][DCTW+v]=Im1DCTCb[DCTH+u][DCTW+v]/CbCrQT[u][v];
      Im1QuaCr[DCTH+u][DCTW+v]=Im1DCTCr[DCTH+u][DCTW+v]/CbCrQT[u][v];

    }
  }
  i = DCTW;
  j = DCTH;
}

2007年7月16日 星期一

針對圖片的YCbCr繪製長條圖

//----第一段程式,做YCbCr的統計----
for(i = 0;i < j =" 0;j">0)
  RecordY[ (int)dbIm1Y[j][i] ]++;
  else
  //處理Y負值的統計
  if(dbIm1Cb[j][i]>0)
  RecordCb[ (int)dbIm1Cb[j][i] ]++;
   else
  //處理Cb負值的統計
  if(dbIm1Cr[j][i]>0)
  RecordCb[ (int)dbIm1Cr[j][i] ]++;
  else
  //處理Cr負值的統計
  }
}
//----第二段程式,處理Y的圖形----
int Im2H,Im2W; //使用Image2

Im2H=Image2->Height;          //取得Canvas大小
Im2W=Image2->Width;
Image2->Picture->Bitmap->Width=Im2W;  //指定BitMap的大小
Image2->Picture->Bitmap->Height=Im2H;
Image2->Picture->Bitmap->PixelFormat=pf24bit; //指定該圖是24bit的圖

for(i=0;i<300;i++)
{
  j=RecordY[i]/6;
  Image2->Canvas->MoveTo(2*i+1,300);
  Image2->Canvas->LineTo(2*i+1,300-j);
}
//----第三段程式,處理Cb的圖型----
int Im3H,Im3W; //畫在Image3上面
Im3H=Image3->Height; //取得Canvas大小
Im3W=Image3->Width;
Image3->Picture->Bitmap->Width=Im3W; //指定BitMap的大小
Image3->Picture->Bitmap->Height=Im3H;
Image3->Picture->Bitmap->PixelFormat=pf24bit; //指定該圖是24bit的圖

for(i=0;i<300;i++) j="RecordCb[i]/6; ">Canvas->MoveTo(2*i+1,300);
  Image3->Canvas->LineTo(2*i+1,300-j);
}
//----第四段程式,處理Cr的圖形----
Im4H,Im4W;

Im4H=Image4->Height; //取得Canvas大小
Im4W=Image4->Width;
Image4->Picture->Bitmap->Width=Im4W; //指定BitMap的大小
Image4->Picture->Bitmap->Height=Im4H;
Image4->Picture->Bitmap->PixelFormat=pf24bit; //指定該圖是24bit的圖

for(i=0;i<300;i++)>
{
   j=RecordCr[i]/6;
  Image4->Canvas->MoveTo(2*i+1,300);
  Image4->Canvas->LineTo(2*i+1,300-j);
}