

| ![]() | ![]() |
|
| ![]() |
![]() | ![]() | ![]() |
這學期上了資工系所開設的「電腦視覺導論」,在朋友給了我一些範例程式碼後,開始寫一些課本上有介紹到的影像處理。
上次她問我,她寫了一個程式,把圖片放大之後圖片卻變暗了,要怎麼處理?
我想說,那就再寫一個可以把圖片變亮的程式呀!
於是著手寫這個程式。
由於我們之前有教到RGB色彩模式轉HSV色彩模式,簡單介紹一下:
RGB色彩模式,R為red(紅),G為green(綠),B為blue(藍),
RGB值皆介於0~255間,值越大代表所含色越多,若RGB皆為255,就是白色。
HSV色彩模式,H為hue(色調),S為saturation(飽和度),V為value(亮度),
H值介於0°~360°間,S、V值介於0~1間。
H=0°代表紅色,120°代表綠色,240°代表藍色。
S值越大,飽和度越高,顏色越鮮艷,V值越高,亮度越高。
(欲知詳情請見Wikipedia: http://en.wikipedia.org/wiki/HSL_and_HSV)
所以就想出了以下解決步驟:
但是這些步驟卻遇到了以下麻煩:
所以上網找了HSV、RGB的轉換公式(就是上面給的網址),
經測試後沒問題(RGB轉HSV後再轉回RGB,圖片看起來差異不大,但是RGB值有改變一些,畢竟這是透過數學公式計算的)。
接下來就是V值的問題了!
一開始我是用這個算法:V = V + (1 - V) * 0.25;
(會這樣算是避免新的亮度值超過1)
但是卻發現紅色暗處會變太亮,在經過幾番嘗試之後,改為:
if (V < 0.5)
V *= (1 + filter_brightness / 10);
else
V += (1 - V) * (filter_brightness / 10);
果然好些!
但又覺得改變亮度太大的話,變的很奇怪,感覺對比也變了。
又是幾番嘗試之後,加上了這些程式碼:
if (filter_brightness >= 5)
S *= 0.8;
else if (filter_brightness >= 0)
S *= 0.85;
else if (filter_brightness >= -5)
S *= 0.9;
沒想到效果真的變的比之前好很多。
最上面那九張圖是程式執行後的結果,
左上輸入值為-10,第二張輸入值為-8,第三張輸入值為-5,
左中輸入值為-3,第二張為原圖,第三張輸入值為3,
左下輸入值為5,第二張輸入值為8,第三張輸入值為10。
做完又是滿滿的成就感。
雖然沒有學過改變亮度的演算法,但是這樣做出來效果也不錯。
希望電腦視覺導論能夠學習到更多好玩的東西!