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

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月19日 星期四

Arduino-程式碼(講師提供)

int a = 2;
int b = 3;
int reset = 4;
int clock = 5;
int sw1 = 13;
int sw2 = 12;
int val1 = 0;
int val2 = 0;

void setup()
{
  beginSerial(9600);
  pinMode(a,OUTPUT);
  pinMode(b,OUTPUT);
  pinMode(reset,OUTPUT);
  pinMode(clock,OUTPUT);
  pinMode(sw1,INPUT);
  pinMode(sw2,INPUT);
}

void loop()
{
  digitalWrite(reset,1);
  val1 = digitalRead(sw1);
  val2 = digitalRead(sw2);
  if (val1==1&&val2==0){
   inputOn();
   clockRun();
  }
  if (val1==1&&val2==1){
   inputOff();
   clockRun();
  }
}

void clockRun()
{
  digitalWrite(clock,1);
  delay(100);
  digitalWrite(clock,0);
  delay(100);
}
void inputOn()
{
  digitalWrite(a,1);
  digitalWrite(b,1);
}
void inputOff()
{
  digitalWrite(a,0);
  digitalWrite(b,0);
}
void resetall()
{
  digitalWrite(reset,1);
  digitalWrite(reset,0);
  digitalWrite(reset,1);
}

Arduino-程式碼(紅綠燈)

int greenPin=11;
int redPin=10;
int yellowPin=9;
int value=0;

void setup(){
 pinMode(greenPin,OUTPUT);
 pinMode(redPin,OUTPUT);
 pinMode(yellowPin,OUTPUT);
}

void loop(){
 if(value==0)
 {
  digitalWrite(greenPin,HIGH);
  digitalWrite(redPin,LOW);
  digitalWrite(yellowPin,LOW);
  delay(5000);
  value=1;
 }
 if(value==1)
 {
  digitalWrite(redPin,LOW);
  digitalWrite(greenPin,LOW);
  digitalWrite(yellowPin,HIGH);
  delay(1000);
  value=2;
 }
 if(value==2)
 {
  digitalWrite(yellowPin,LOW);
  digitalWrite(greenPin,LOW);
  digitalWrite(redPin,HIGH);
  delay(2000);
  value=0;
 }
}
//這是我自己寫的....

Arduino-圖片

[Class1:讓綠燈閃爍]
[Class2:紅綠燈(各自設定課題)]

[Class 3:本課程最終目標,麵包版(only)]

[Class 3:同上,全圖版本]




2007年7月17日 星期二

JSteg

Input: message, cover image
Output: stego image
while data left to embed do
    get next DCT coefficient from cover image
    if DCT ≠ 0 and DCT ≠ 1 then
      get next LSB from message
      replace DCT LSB with message LSB
    end if
    insert DCT into stego image
end while

這是JSteg的Algorithm

DCT coefficients



第一支程式作業,寫出DCT coefficients的Histogram
下圖是,用J-Stego藏過資料後的Histogram

卡方攻擊法



p->1時,越有可能藏資料
p->0時,越不可能藏資料

2007年7月16日 星期一

[嘗試翻譯]Hide and Seek--An Introduction to Stegangraphy

原文:http://niels.xtdnet.nl/papers/practical.pdf

Steganography 是隱藏情報的科學與藝術;一個Steganographic的系統,可以用Media將訊息覆蓋,這樣一來,就不會引起監聽者的懷疑。在過去,人們使用隱藏的刺青或是隱形墨水來傳送或傳達Steganographic訊息。現在,電腦與網路的科技提供Steganography一個易於使用溝通方式。

本來,一個Steganographic的系統在處理資訊隱藏的程序上,開始於定義(鑑定、辨識)一個多餘的媒介(那些可以被修飾)那些植入的程序創造了一個stego medium,被隱藏資料的多餘位元取代。

現代的Steganography的目標,是不僅保持隱藏訊息存在時不被偵測,那些系統讓資料藏的更自然。--讓人遺忘或沒想過要去追查是否有問題。
如果秘密的容器不被暴露(洩漏),它的存在不過就是修飾覆蓋的媒介,改變了它的統計過後的特性,如此一來監聽者能偵測到是失真的統計數據結果。
那個使之找到失真數據的程序叫做統計學上的Steganalysis

這篇文章討論已經存在的Steganographic系統以及目前新進的搜尋偵測技術。
其他調查的焦點在一般的資訊隱藏使用方法上,或提供一個過去使用的偵測用演算法。在這裡,我們準備了新的搜尋方法跟議題以及新的演算法以及與其有關的應用程式。

The basic of embedding
資訊隱藏系統有三個不同的重點,分別是:容量(可藏的資料量)、安全性、強韌性。
容量是指是否能容納下大量的資訊、安全性是指是否能被輕易的偵測到、強韌性則是指隱藏資料的媒介是否容易因為被調動而導致資料被摧毀。

說到資訊隱藏,一般泛指water-marking跟Steganography。
一個water-marking的系統追求高程度的強度,也就是藏進去的東西不可能被移除或是摧毀。而Steganography則是追求容量與安全性。

一個傳統的Steganography系統的安全性依賴於系統的密碼,這種類型可以以羅馬過去的系統作為範例,他們將密碼刺在沒有頭髮的頭皮上。等到頭髮長出來,他就可以將訊息傳送過去。雖然這種方法很花時間,但是這個方法已經足夠通過檢測。

現在的Steganography試圖變成需要擁有一個密碼才能偵測到秘密訊息,也就是所謂的Key。

針對圖片的YCbCr繪製長條圖--(Show Picture)

[1.學姊給的圖and基礎介面]
[2.從0~300的Y值統計]

[ 3.從0~300的Cb值統計]

[4.從0~300的Cr值統計]

※左上角還有座標軸,嘗試將長條圖的值以及出現次數用X,Y做表示


針對圖片的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);
}






Test1

為了放程式碼而設定的BLOG