2013年11月15日 星期五

HW2

這次的作業有三個小部分 : Levels、Curve 和 Histogram

Levels 色階


  此功能可以處理影像的對比亮度。輸入四個整數值 ( InputMin . InputMax . OutputMin . OutputMax ) ,X 軸為 Input 的值,Y 軸為Output 的值,當值有變動時,就要重新畫圖以及計算。上圖中的 Original Image 為 Load 進來的圖,當 Original Image Load 進來時  New Image 也要跟著 Load 進來,不然當要執行 Level 計算時會出現 Error,因為通常 bitmap 元件在還沒放進影像時,是沒有配置記憶體的,所以會出現如下圖所示告知使用者 scan line 超出範圍。


主要程式碼
for (i=0;i<256;i++)
 {
        if ( i <= iInputMin)
               iLevelsTable[i] = iOutputMin;
else if ( i >= iInputMax )
       iLevelsTable[i] = iOutputMax;
else
        {
iInputInterval = iInputMax - iInputMin;
iOutputInterval = iOutputMax - iOutputMin;
                iLevelsTable[i] =  iOutputMin + (int)((float) iOutputInterval * (i - iInputMin) / iInputInterval + 0.5) ;
         }
 }

================================================================
Curve 曲線


  此功能和 Level很像,一樣是在處理影像的對比亮度 ,不同的地方是 Level 是給予一定的範圍,利用 InputMin . InputMax . OutputMin 和 OutputMax 計算並畫出 Level 的圖;而 Curve 則是在圖上點一點,並利用曲線公式 (y=ax^2+bx+c) 將圖上的一點帶入並連接計算出 Curve 所執行出來的結果。上圖中的 Original Image 一樣為 Load 進來的,Load 進來同時 New Image 跟著 Load 進來,避免再次出現 Error,曲線中的紅點為使用者所點的,按下 Curve Button 就會更新 New Image 的影像了。

主要程式碼

for (i=1;i<255;i++)
{
        iCurveTable[i] = (int)(( fCoeA * i * i + fCoeB * i) + 0.5);
        if (iCurveTable[i] > 255)
            iCurveTable[i] = 255;
        if (iCurveTable[i] < 0)
            iCurveTable[i] = 0;
        imCurve->Canvas->LineTo(i,255-iCurveTable[i]);
 }
 imCurve->Canvas->LineTo(255,0);

================================================================
Histogram 色彩統計直方圖


  此功能在做 Red、Green 和 Blue 三個色彩的統計,利用統計的方式可以了解到三個色彩分佈的值有多少。如上圖所示,點選要顯示出來的統計圖,並點選左上角的主選單第二個Image 裡的 Histogram (如下圖所示)就會出現色彩統計方圖。


主要程式碼
for (j=0;j<iImageHeight;j++)
{
bPtrImage = (Byte *)Image1->Picture->Bitmap->ScanLine[j];
for (i=0;i<iImageWidth;i++)
for (k=0;k<iChannelNumber ;k++)
 iHistogram[k][bPtrImage[i*3+k]]++;
}
================================================================

  這次的作業感覺起來好像很難,但大部分的程式碼都給了,所以難度降低很多,不過還是有很多小問題,像是程式打完可以執行,但為什麼執行到一半出現 Error,自己也不懂問題出現在哪,英文也只看得懂超出範圍,但不知道是什麼東西,於是將訊息截圖問老師此錯誤訊息是什麼,一問之下才知道輸出的影像要和輸入的影像一起 Load,不然影像在做 scan line時會找不到位置去記,於是我將影像輸出的地方先做和影像輸入的動作一樣 Load,就解決了超出的範圍。

  做 Level 時,要知道當值小於InputMin時,輸出值為OutputMin;值大於InputMax時,輸出值為OutputMax,這些搞混的畫圖就畫不出來,執行結果也會是錯的。

  做 Curve 前的公式推導很重要,不懂拋物線方程式的話就無法完成話曲線的動作,點一點要知道座標,並將座標帶入拋物線的公式裡,才能畫出曲線。

  做 Histogram 時,要裡用陣列存取紅、綠、藍三色的值,並利用 for 迴圈將相對應的值去做加一動作,最後輸出利用對應的畫筆顏色將對應的值畫在畫布上。

沒有留言:

張貼留言