色階與曲線的調整。由於在 Paint.net 中的曲線是我非常喜歡的功能。
一度想要實作,但總是沒什麼機會。這次趁著作業就順便做了。
(圖 1)Paint.net 曲線功能 |
對於,曲線功能來說,最關鍵的是插值。
由於我不能找到 Paint.net 的插值方法,所以我使用普通的拉格朗日插值(非重心):
(圖 2)當存在 k 個點 From wikipedia |
(圖 3)插值多項式 From wikipedia |
(圖 4)插值多項式中的函數 From wikipedia |
利用迴圈就可以實做出來,唯一要注意的是隱含的數值轉換,
相除之後 float、double 跟 int 的對應、捨去關係,以及邊界處理。
通過函數 f(x) = min(255, max(0, x)) 處理邊界問題,其中 min、max 定義於 cmath 的 std 中。
(圖 5)原始圖片 |
(圖 6)Red 曲線上存在一個點,使圖片紅色分量上升 |
(圖 7)同時存在多個點的情況 |
(圖 8)三個分量都有做調整的情況 ※ 注意圖中的 Red、Green 視窗是另外合成的 軟體實際上沒有實作同時顯示的功能 |
由於該色彩的分量增加,圖片的亮度就會上升,可以注意(圖 5)及(圖 6)的差異。
另外觀察(圖 7)可以發現,當曲線非遞增時,圖片的色彩會較不自然。
對於三個分量都有做調整時,也就是(圖 8)的情況。
雖然增加了 Red 分量,但 Green 與 Blue 都減少,使得整體的亮度下降。
但相較(圖 6)紅色明顯增加,由這裡可以發現,
如要增加單一分量而不要增加亮度,則三個曲線平均要剛好是 y = x 線性函數;
如果增加單一分量、而減少亮度,則應該降低另外兩個分量而非提升目標的單一分量。
沒有留言:
張貼留言