網路城邦
上一篇 回創作列表 下一篇   字體:
C++ 程式__改變亮度
2009/03/08 14:25:21瀏覽7593|回應2|推薦10


這學期上了資工系所開設的「電腦視覺導論」,在朋友給了我一些範例程式碼後,開始寫一些課本上有介紹到的影像處理。

上次她問我,她寫了一個程式,把圖片放大之後圖片卻變暗了,要怎麼處理?

我想說,那就再寫一個可以把圖片變亮的程式呀!

於是著手寫這個程式。


由於我們之前有教到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

所以就想出了以下解決步驟:

  1. 提示請使用者輸入要改變的亮度的多寡(-10~10,暗~亮)
  2. *.bmp的圖片RGB值抓出來
  3. 經過公式換算成HSV
  4. 改變V值
  5. 把換算後的HSV值轉回RGB模式
  6. 存成*.bmp檔。

但是這些步驟卻遇到了以下麻煩:

  1. 如何改變V值?(V值不能>1)
  2. 如何從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。

做完又是滿滿的成就感。

雖然沒有學過改變亮度的演算法,但是這樣做出來效果也不錯。

希望電腦視覺導論能夠學習到更多好玩的東西!

( 知識學習其他 )
列印 加入我的文摘
上一篇 回創作列表 下一篇

引用
引用網址:https://classic-blog.udn.com/article/trackback.jsp?uid=gn01897234&aid=2722185

 回應文章

fbi航
請問可以傳給我改變亮度的程式嗎?
2010/11/01 21:28

請問可以寄給我改變亮度的程式嗎?我想參考看看!

信箱:bb313043@yahoo.com.tw

琳 KTT(gn01897234) 於 2010-11-12 19:55 回覆:
可以是可以…但是方法我是自己亂寫的,因為我那個時候沒有學過調整亮度的方法,所以可能會有問題。

隨興(隨時換)
等級:8
留言加入好友
很棒吔.........
2009/03/08 15:05
以前照片拍暗了,因有紀念價值不捨得刪,又有些懊腦,現在用一些軟體就可以把它調亮.剪裁及做特效,真棒!
琳 KTT(gn01897234) 於 2009-03-09 12:25 回覆:

電腦的發明、軟體的發展,為生活帶來很大的便利!

也是因為如此,才會想要走資工這條路,希望可以發展更多方便、好用的軟體,讓大家方便使用。