作業內容 : 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.或將上述程式碼畫底線部分改為
正確之影像(圖四)
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次的作業裡,可以發現到影像處理的作業,基本上
都可以靠幾個迴圈就達成目的,只要對元件的操作用法熟悉,程式就能順利完成。
沒有留言:
張貼留言