Level和Curves
未處理過的圖像,如果該圖元本身存儲的是某一個顏色值,則顯示出來的顏色也是依舊不做改變,也就是input=output
Level
將該圖像中的線當作是直線,用函數的表示方法就是y=x
對輸入值的範圍和輸出的值進行修改,新的直線y=kx+b
K=(OutPutMax-OutPutMin)/(InputMax-InputMin)
b=outputMin-k*inputMin;
通過上一章節的直方圖,我們可以知道一張圖片的顏色值的分佈情況,將集中的顏色範圍做出新的輸入值範圍:
圖片的顏色多了一些白濛濛的感覺,直方圖的顏色分佈也沒有之前那麼的集中了
如果把其變成把0-255轉為255-0的輸出時,照片就會變為底片的形式顯現,而之前的直方圖也會對稱的反轉過去。
這裡需要克服的問題是,因為Edit控制項輸入的是字串,需要讓輸入的值是數位,因此需要進行設定:
按兩下事件中的OnKeyPress
void __fastcall TForm1::Edit1KeyPress(TObject *Sender,
System::WideChar &Key)
{
if(Key<48||Key>57)Key=0;//0-9的ASCII碼值範圍內有效
}
此外需要將Edit中的值轉為INT值進行運算:
inputMin=StrToInt(Edit1->Text);
inputMax=StrToInt(Edit2->Text);
outputMin=StrToInt(Edit3->Text);
outputMax=StrToInt(Edit4->Text);
Curves
Curves和Level略有不同,在Photoshop中Curves可以讓用戶確定14個點,然後用光滑的曲線進行連接,我們這裡簡化為用戶確定一個點(ppx,ppy),然後用一元二次函數的計算方式確定
Y=ax^2+bx+c
因為使用者確定了一個點,而且曲線固定通過(0,0)(255,255)兩個點,三個點足以畫出該曲線:
點擊Curves按鈕,按一下refresh後可以得到下列圖像:
如果滑鼠按一下在左上角時,圖片會顯得白而亮一些,直方圖也會有一些分散而不像之前那樣集中,因為每一個顏色的輸出都比之前的顏色數值更大,所以更加接近於白色。
如果滑鼠按一下在右上角時,圖片會顯得灰一些,偏向照片底色,直方圖也會更加集中在一側,因為每一個顏色的輸出都比之前的顏色數值更小,所以更加接近於黑色,所以偏灰暗。
這裡需要處理的問題是,如何讓軟體知道滑鼠點擊位置並將座標返回顯現與螢幕中:
在Image的事件中按兩下OnMouseDown事件編寫程式:
沒有留言:
張貼留言