這是我這次程式的外觀,裡面有的功能包括讀檔、負片調整功能、影像長條圖資訊以及圖片色階調整功能(包括線性及曲線的)。
首先這是我這次選的圖。
一開始選這圖的時候原本想說長條圖資訊不會稀疏的很誇張,但用了之後我發現我錯了(真的不能相信自己的眼睛,請相信實際計算後顯示的結果)。那麼廢話就不多說了,來講解一下影像資訊的長條圖該如何求出,方法就是掃描過圖片全部的點,將RGB三個顏色在各個色階的量給累加出來,需要注意的一點是每個像素點等同於在陣列中的連續三個位置存入RGB三個顏色的數值,但儲存的順序不是RGB而是BGR。簡單說明就是假設i是像素點個數,那麼在每個3*i中存的會是該像素點藍色的數值、3*i+1中存的會是該像素點綠色的數值、3*i+2中存的會是該像素點紅色的數值。另外要掃描過全部的像素點的方法除了用傳統的Canvas->Pixels[x][y]外,還可以用scanline一行一行去讀取的方法(差異在於執行速度,scanline較快)。畫線部分是透過Image->Canvas->Pen->Color改變筆的顏色再利用MoveTo(畫布指標移至畫布某位置)和LineTo(從畫布指標目前位置移至指定位置)兩個指令來完成畫線。
接著說明一下我寫的程式,左邊的RadioGroup1(忘了更名...)是在選擇要一般長條圖還是累加型;Channel是選擇顏色,製作方法就是透過幾個CheckBox並在程式碼中多加幾行判斷,來選擇顏色。中間的upper和downer是在調整比例,讓數值能透過人工的方式調整至最佳範圍,實作方法就是多設定一個變數,將全部數值統一乘或除這個變數,在改變這個變數就可以達成改變比例。右邊原本是想做滑鼠指到長條圖上某位置就將該點資訊顯示在Memo上,但還沒完成,如過有機會,可能會在後面幾版完成這功能。
這就是這張圖的累積值方圖,由於點很稀疏,所以蠻平的。
然後是Level的部分,也就是圖片色階調整功能。首先是線性的,線性的需要4個數值,分別是Input的Max及min與Output的Max及min,主要的動作是將小於InputMin的值改成OutputMin,將大於InputMax的值改成OutputMax,中間則透過這4個數值連出一條直線。其實這個只要能推導出其公式(用兩點求方程式)就很簡單。須注意的是,不要直接對每個像素點做運算,這樣做會很花時間,可以先將這256個數值經轉換後所對應的數值存起來,透過查表就可大幅加快執行效能。
PS.老師在期中考卷有錯誤,第6題第1個for迴圈應該改成
for(i = 0;i < 256;i++)
{
if(i < _______)
iLevel[i]=iOutputMin; //題目寫iLevel[i]=0
if(i > _______)
iLevel[i]=iOutputMax; //題目寫iLevel[i]=255
.......以下略
最後是曲線部分,曲線需要3個點,分別是(0,0)、(255,255)以及使用者自訂的點(x,y),透過這三個點可決定出一條曲線,比較麻煩也同時是我有遇到的問題是轉換,如果直接用整數形式運算可能會出問題,所以要適時地轉換成浮點數。
以上就是這次的心得感想及程式demo。
------------------------------------------------------------------------------------------------------------
由於之前選用的圖片不太好
因此更新其他照片的結果
首先這是範例圖片裡的企鵝圖
這是他的原長條圖
這是累積長條圖
沒有留言:
張貼留言