2016年12月10日 星期六

03360440 曾郁凱 HW03

作業內容 : Level & Curve

1. Level


透過手動輸入改變 InputMax ,InputMin ,OutputMax ,OutputMin,調整照片色彩明暗度。

公式 :
           
                                                                                            OutputMax - OutputMin
          Output = OutputMin + ( Input - iInputMin) *            -------------------------------------
                                                                                             InputMax  -  InputMin
有幾點需要注意

1. 原影像色階若高於InputMax,則要讓它等於OutputMin,
     
     而原影像若色階低於InputMin,則要讓它等於OutputMax。

程式碼 :
             
              for ( j = 0 ; j < iImageHeight ; j++ )
                 {
                 bPtrImageRow = (Byte *) Image1->Picture ->Bitmap ->ScanLine[ j ];
                 bPtrNewImageRow = (Byte *) Image8->Picture ->Bitmap ->ScanLine[ j ];
                 for ( i = 0 ; i < iImageWidth ; i++ )
                    {
                    for ( k = 0 ; k < 3 ; k++ )
                       {
                       if ( bPtrImageRow[3 * i + k] > iInputMax )
                          bPtrNewImageRow [3 * i + k] = iOutputMax;
                       else if ( bPtrImageRow[3 * i + k] < iInputMin )
                          bPtrNewImageRow [3 * i + k] = iOutputMin;
                       else
                          bPtrNewImageRow [3 * i + k] = iOutputMin+
                          (bPtrImageRow[3*i+k]-iInputMain)
                          *((iOutputMax-iOutputMin)/(iInputMax-iInputMin));  
                       } 
                    }
                 }   

2. 上方底線的部分須注意,若一開始為將變數宣告成int 則影像會修改錯誤。

例子 :
原影像(圖一)


色階調整函數圖(圖二)

調整過後錯誤(圖三)

解決辦法 :
                 1.一開始就先宣告成float

                 2.或將上述程式碼畫底線部分改為

                    ( ( (float) iOutputMax - iOutputMin ) / ( iInputMax - iInputMin ) ) + 0.5

正確之影像(圖四)

3. 手動輸入 InputMax ,InputMin ,OutputMax ,OutputMin必須有防呆的部分。

4. 色階調整函數圖 (分三段畫)

部分程式碼 :
                     
                      Image9 -> Canvas -> MoveTo( 0 , 500 - 2 * iOutputMin );
                      Image9 -> Canvas -> LineTo( 2 * iInputMin , 500 - 2 * iOutputMin );
                      Image9 -> Canvas -> LineTo( 2 * iInputMax , 500 -2 * iOutputMax );
                      Image9 -> Canvas -> LineTo( 500 , 500 - 2 * iOutputMax );

2. Curve : 利用曲線來修改圖片

1 . 首先要修改曲線圖上的點,我們會用到Image事件MouseDown,藉由這個事件
     
    我們可以取得點的XY座標,把新座標帶入就能得到一些關係式
   
    Y = Y - 255;
   
    a =double( Y - X ) / ( X * X - X * 255 );

    b = double(1 - 255 * a );

2 . 改變原影像

部分程式碼:
    
                      for ( i = 0 ; i < iImageHeight ; i++ )
                         {
                         bPtrImageRow = (Byte *) Image8->Picture->Bitmap ->ScanLine[i];
                         for ( j = 0 ; j < iImageWidth ; j++ )
                            {
                            for ( k=0 ; k < 3 ; k++)
                               bPtrImageRow [ 3 * j + k ] = Curve[ bPtrImageRow[3*j+k] ];
                            }
                         }  
成果
 
 

曲線圖(圖五)


                                    調整後(圖六)                                    


曲線圖(圖七)


 調整後(圖八)

心得 :

Level 的部分套用上課推導出的公式,我們可以輕易的轉成程式碼,讓電腦幫忙計算,

並成功的調整照片色彩明暗度,而在Curve的部分我們可以比對圖六和圖八,兩張圖

分別為變亮和變暗,再觀察圖五和圖七,我們可以發現當曲線凹向下時,圖片整體會變亮,

而曲線凹向上則圖片整體變暗,而再這2次的作業裡,可以發現到影像處理的作業,基本上

都可以靠幾個迴圈就達成目的,只要對元件的操作用法熟悉,程式就能順利完成。



 



沒有留言:

張貼留言