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 迴圈將相對應的值去做加一動作,最後輸出利用對應的畫筆顏色將對應的值畫在畫布上。
沒有留言:
張貼留言