国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > 綜合 > 正文

VB圖像處理,(六)圖像的亮度對比度調整

2024-07-21 02:20:56
字體:
來源:轉載
供稿:網友
在圖像處理中,恐怕大家最熟悉的就是對于圖像的亮度和對比度調整了。
前面一定也有很多人寫過這樣的文章了,但是想把我的這個系列作一個完整的小結,我就再羅嗦一番了。
還是以24位色圖像為例子,每種色彩都可以用0-255,一共256種深度來表示。
如果我們把它畫在一個二維坐標上,正好是一條直線。
比如我們將像素的色深作為橫坐標,輸出色深作為縱坐標的畫,正好是一條經過原點(0,0)的45度斜線。
如圖中直線a所表示的,角t為45度,表示它的對比度正好為1。
那么很容易就可以寫出它的直線方程:out = in * 1 ,系數1就是對比度的概念
如果把條直線加上一個偏移量變成b,那么它的直線方程就成為:out = in * 1 + (ab)
偏移量(ab)就是亮度的增量。
只要有初中的代數知識就很容易看出它滿足一條直線方程:y= a * x + b
但是,我們這里要處理的情況稍微有些不同,在圖像處理中,對比度和亮度要分別對待。
不能因為改變而改變亮度,因為我們習慣上把灰色(127,127)這一點作為中心點。
比如,我們加大了對比度,原來的直線a就變成如直線d所表示的,在改變了對比度的同時,也增加了亮度(ab),而我們心目中的變化應該是入直線c那樣。也就是說,我們把(127,127)這一點映射成了坐標系的原點。
那么我們就要把原來的直線公式修改成:y=( x - 127 ) * a + b。a表示對比度,b表示亮度增量。
我們驗證一下:只要亮度增量 b=0,無論怎么改變對比度 a,該直線始終通過中心點(127,127),也就是說改變對比度的同時,亮度沒有改變。
由此,我們就可以推導出顏色的對比度亮度計算公式了:
newred = (oldred -127 ) * a + 127+ b
newgreen = (oldgreen -127 ) * a + 127+b
newblue = (oldblue -127 ) * a + 127+b
現在你是否已經準備著手用這個公式來寫出你自己的亮度對比度子程序了呢?
慢著,再多做一步吧。我們是在遍程序,不是在做初中代數考試。這多出來的一步將使你的程序的執行效率更高一些。
我們把上面的公式再推導一下:
y=( x - 127 ) * a + b => y = x * a - 127 * a + 127+b (1)
令:b = b -127 * a +127 (2)
由上面(1),(2)兩步,得到一個新的公式:y = x * a + b
咦?怎么又變回來了??
是的公式的形式確實是變回來了,不過b所代表的東西已經不同了。
或許你又會說我這是多此一舉,請聰明的讀者想像一下:在一個普通的圖片做亮度對比度運算的時候,我們上面這些小小的變化將帶來什么樣的效率提升。假設一張圖片大小是1027*768
一共有786432個像素,而每個像素又要分別計算紅綠藍三種顏色。
那么,上述這個公式就需要計算786432 * 3 = 2359296 次,經過這么多次運算的放大,哪怕是小小的一個重復計算都將浪費很長的時間。
因為在調用子程序的時候亮度和對比度都已經確定,那么b = b -127 * a +127這一步就可以放在循環的外面先作好。從而減少了程序的運算時間。
下面給出我的程序,以供參考:
public sub brightnessandcontrast(byval redoffset as long, byval greenoffset as long, byval blueoffset as long, optional byval redcontrast as single = 1, optional byval greencontrast as single = 1, optional byval bluecontrast as single = 1)
dim x as long
dim y as long
dim midr as integer
dim midg as integer
dim midb as integer
dim max as long
on error goto errline
done = false
timefilter = timegettime

midr = redoffset - 127 * (redcontrast - 1)
midg = greenoffset - 127 * (greencontrast - 1)
midb = blueoffset - 127 * (bluecontrast - 1)
max = 255 '* valueratio
for x = 0 to outputwid
for y = 0 to outputhei
r = colout(2, x, y)
g = colout(1, x, y)
b = colout(0, x, y)
r = r * redcontrast + midr
g = g * greencontrast + midg
b = b * bluecontrast + midb
if r > max then r = max
if r < 0 then r = 0
if g > max then g = max
if g < 0 then g = 0
if b > max then b = max
if b < 0 then b = 0
colout(2, x, y) = r
colout(1, x, y) = g
colout(0, x, y) = b
next
next
done = true
timefilter = timegettime - timefilter
exit sub
errline:
msgbox err.description
done = true
end sub

因為在亮度對比度的過程中會出現計算值超出(0,255)的范圍,因此需要對它做一個判斷,把結果限定在這個范圍之內。
這個程序很簡單,可以根據給定的紅綠藍的亮度偏移量和對比度參數計算。由于把三種顏色的6個參數分開,也可以只調整單獨的一種顏色。
還有一個好處,就是當你將對比度參數設為負值的時候,可以直接得到原圖片的反色輸出。(這也是將前面的坐標系原點移動到127這一點的一個好處。)
下面是用我的程序處理得到的效果:
原圖:
亮度+20,對比度1.5效果:
對比度 -1,反相色彩效果:


作為這個系列的最后一篇文章,我在我的程序imagecast中所用到的所效果的算法和主要代碼都已經貼出來了。也算是對自己對大家的一個小小交待吧。
如果有興趣的朋友可以下載我的程序試試。
下載地址:http://club.5ivb.net/dispbbs.asp?boardid=1&id=40069
程序界面:

如果讀者對這個過程中的一些數組和變量不清楚,請參考我前面的幾篇文章,其中有詳細說明:
vb圖像處理,(一)像素的獲取和輸出

vb圖像處理,(二)二次線性插值的應用

vb圖像處理,(三)幾個常用濾鏡的實現1

vb圖像處理,(四)幾個常用濾鏡的實現2

vb圖像處理,(五)圖像的色彩糾正

(這里只是說了我自己在寫程序的時候用到的方法,存在很多的不足。并且因為在貼上來的時候作了部分修改,可能會存在部分錯誤,請各位高手不吝賜教,將您用到的更好的方法提供一下,我將不勝感激。)




發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 阳江市| 千阳县| 长顺县| 土默特右旗| 商河县| 卓资县| 万源市| 津南区| 霍州市| 建宁县| 西平县| 正安县| 美姑县| 休宁县| 上杭县| 卓资县| 巴楚县| 洛阳市| 玉山县| 丹东市| 通榆县| 广州市| 郯城县| 新田县| 晴隆县| 吉隆县| 满城县| 盐池县| 藁城市| 保山市| 长顺县| 老河口市| 封开县| 寿阳县| 浑源县| 来凤县| 策勒县| 临西县| 论坛| 额尔古纳市| 潍坊市|