| ![]() | ![]() |
|
| ![]() |
![]() | ![]() | ![]() |
這學期上了資工系所開設的「電腦視覺導論」,在朋友給了我一些範例程式碼後,開始寫一些課本上有介紹到的影像處理。
上次她問我,她寫了一個程式,把圖片放大之後圖片卻變暗了,要怎麼處理?
我想說,那就再寫一個可以把圖片變亮的程式呀!
於是著手寫這個程式。
由於我們之前有教到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)
所以就想出了以下解決步驟:
- 提示請使用者輸入要改變的亮度的多寡(-10~10,暗~亮)
- *.bmp的圖片RGB值抓出來
- 經過公式換算成HSV
- 改變V值
- 把換算後的HSV值轉回RGB模式
- 存成*.bmp檔。
但是這些步驟卻遇到了以下麻煩:
- 如何改變V值?(V值不能>1)
- 如何從HSV模式轉回RGB模式?
所以上網找了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。
做完又是滿滿的成就感。
雖然沒有學過改變亮度的演算法,但是這樣做出來效果也不錯。
希望電腦視覺導論能夠學習到更多好玩的東西!
2樓. fbi航2010/11/01 21:28請問可以傳給我改變亮度的程式嗎?
請問可以寄給我改變亮度的程式嗎?我想參考看看!
信箱:bb313043@yahoo.com.tw
可以是可以…但是方法我是自己亂寫的,因為我那個時候沒有學過調整亮度的方法,所以可能會有問題。 琳 KTT 於 2010/11/12 19:55回覆- 1樓. 隨興(隨時換)2009/03/08 15:05很棒吔.........
以前照片拍暗了,因有紀念價值不捨得刪,又有些懊腦,現在用一些軟體就可以把它調亮.剪裁及做特效,真棒!



















