2007年4月11日 星期三

Histogram

部份程式碼:
 for( i = 0 ; i <IH ; i++ )
 {
 ptr = (Byte * )Image1->Picture->Bitmap->ScanLine[i];
  for( j = 0 ; j < IW ; j++ )
  {
   R[ i ][ j ] = ptr[ j * 3 + 2 ];
   G[ i ][ j ] = ptr[ j * 3 + 1 ];
   B[ i ][ j ] = ptr[ j * 3 ];
  } //每個座標將RGB的值分開來存放
  }
-----------------------------
  //以下只有展示處理R...G跟B很類似的方法
  for( i = 0 ; i <IH ; i++ )
 {
  ptr = ( Byte * ) Image2->Picture->Bitmap->ScanLine[i];
  for( j = 0 ; j < IW ; j++ )
  {
   ptr[j * 3 + 2 ] = R[ i ][ j ];
   ptr[j * 3 + 1 ] = 0;
   ptr[j * 3 ] = 0;
  }  //把R的值讀出來並且顯示在Image2
 }
-----------------------------
 for( i = 0 ; i < IH ; i++ )
 {
  for( j = 0 ; j < IW ; j++ )
  {
   TR = R[i][j];
   RH[ TR ]++;   TG = G[i][j];
   GH[ TG ]++;   TB = B[i][j];
   BH[ TB ]++;
   }
  }   //上述程式紀錄RGB 0~255每個值各有幾點

 for(i=0;i<256;i++)
 {
  if (Rmax<RH[i])
  {
   Rmax=RH[i]; //如果Rmax小於RH[i],Rmax=RH[i]
  } } //G跟B略

 for (i=0;i<255;i++)  //假設x為該畫幾點
 {
  x = (RH[i]*IH) / Rmax;
  TempR[i]=x;
  Image5->Canvas->MoveTo(i*2,IH);
  Image5->Canvas->LineTo(i*2,IH-x);
 }
----------------------
如果只是取出RGB值跟畫出基礎的Histogram,以上的程式碼已經足夠。我後面的程式碼雖然可以往上畫,但是卻沒有辦法縮短Histogram,因此暫時省略。

其他更高級的功能都還沒有生出來@__@
目前還卡在怎麼把長度縮短。

沒有留言: