调整图像- 自动对比度、自动色阶算法
我們以24位彩色圖像為例說明這兩個(gè)算法。
在執(zhí)行兩個(gè)算法之前,我們需要確定兩個(gè)參數(shù),大家在用PS時(shí)選擇自動(dòng)色階并不會(huì)彈出什么參數(shù)設(shè)置對話框,那是因?yàn)镻S把這個(gè)隱藏的比較深?。選擇曲線或色階命令,然后在彈出的界面中點(diǎn)擊選項(xiàng)按鈕,會(huì)出現(xiàn)如下界面:
????
注意其中的裁剪(C)/裁剪(P)中的變量,這兩個(gè)參數(shù)是影響自動(dòng)色階效果的重要數(shù)據(jù),我們以變量LowCut和HighCut來記錄它。
???? 好,接著說。兩個(gè)算法的第一步,都是分別統(tǒng)計(jì)各通道(紅/綠/藍(lán))的直方圖。
?1?????Dim?HistRed(255)????????As?Long,?HistGreen(255)????????As?Long?2?????Dim?HistBlue(255)???????As?Long
?3?????For?Y?=?0?To?Height?-?1
?4?????????Speed?=?Y?*?Stride
?5?????????For?X?=?0?To?Width?-?1
?6?????????????Red?=?ImageData(Speed?+?2):?Green?=?ImageData(Speed?+?1):?Blue?=?ImageData(Speed)
?7?????????????HistRed(Red)?=?HistRed(Red)?+?1?????????????????'統(tǒng)計(jì)直方圖
?8?????????????HistGreen(Green)?=?HistGreen(Green)?+?1
?9?????????????HistBlue(Blue)?=?HistBlue(Blue)?+?1
10?????????????Speed?=?Speed?+?3
11?????????Next
12?????Next
????? 看了上面代碼,我很欣賞C++的++運(yùn)算符,HistRed(Red)++,多么簡單啊,而且更高效。
????? 算法的第二步,分別計(jì)算各通道按照給定的參數(shù)所確定的上下限值。什么意思呢,比如對于藍(lán)色通道,我們從色階0開始向上累加統(tǒng)計(jì)直方圖,當(dāng)累加值大于LowCut*所有像素?cái)?shù)時(shí),以此時(shí)的色階值計(jì)為MinBlue。然后從色階255開始向下累計(jì)直方圖,如果累加值大于HighCut*所有像素時(shí),以此時(shí)的色階值計(jì)為MaxBlue。
?1?????PixelAmount?=?Width?*?Height?????????????????????'所有像素的數(shù)目?2?????Sum?=?0
?3?????For?Y?=?0?To?255
?4?????????Sum?=?Sum?+?HistBlue(Y)
?5?????????If?Sum?>= PixelAmount?*?LowCut?*?0.01?Then???'注意PS界面里的那個(gè)百分號(hào)
?6?????????????MinBlue?=?Y??????????????????????????????'得到藍(lán)色分量的下限
?7?????????????Exit?For?????????????????????????????????'退出循環(huán)
?8?????????End?If
?9?????Next
10?????
11?????Sum?=?0
12?????For?Y?=?255?To?0?Step?-1
13?????????Sum?=?Sum?+?HistBlue(Y)
14?????????If?Sum?>=?PixelAmount?*?HighCut?*?0.01?Then??'注意PS界面里的那個(gè)百分號(hào)
15?????????????MaxBlue?=?Y??????????????????????????????'得到藍(lán)色分量的上限
16?????????????Exit?For?????????????????????????????????'退出循環(huán)
17?????????End?If
18?????Next
????? 綠色通道和紅色通道的代碼類似,請朋友們自己補(bǔ)充。
????? 下一步,自動(dòng)色階和自動(dòng)對比度就有所區(qū)別了,我們首先介紹自動(dòng)色階。
????? 自動(dòng)色階:按照我們剛剛計(jì)算出的MinBlue/MaxBlue構(gòu)建一個(gè)隱射表,隱射表的規(guī)則是,對于小于MinBlue的值,則隱射為0(實(shí)際上這句話也不對,隱射為多少是和那個(gè)自動(dòng)顏色校正選項(xiàng)對話框中的陰影所設(shè)定的顏色有關(guān),默認(rèn)情況下是黑色,對應(yīng)的RGB分量都為0,所以我們這里就隱射為0,有興趣你們也可以指定為其他的參數(shù)),對于大于MaxBlue的值,則隱射為255(同理,這個(gè)值和高光的顏色設(shè)置有關(guān)),對于介于MinBlue和MaxBlue之間的值,則進(jìn)行線性隱射,默認(rèn)是隱射為0到255之間(當(dāng)然實(shí)際是和我們的暗調(diào)和高光的設(shè)置有關(guān),并且這里其實(shí)也不是線性隱射,是有一個(gè)Gamma校正,為了簡便,用線性替代效果也沒太大的問題)。
1?????For?Y?=?0?To?2552?????????If?Y?<=?MinBlue?Then
3?????????????BlueMap(Y)?=?0
4?????????ElseIf?Y?>= MaxBlue?Then
5?????????????BlueMap(Y)?=?255
6?????????Else
7?????????????BlueMap(Y)?=?(Y?-?MinBlue)?/?(MaxBlue?-?MinBlue)?*?255??????'線性隱射
8?????????End?If
9?????Next
??????順便提一點(diǎn),從程序的魯棒性上來說,在執(zhí)行這段代碼前判斷下MaxBlue是否等于MinBlue很有必要,兩者相等,這圖就無需校正了,直接結(jié)束程序。
????? 用同樣的道理,計(jì)算出綠色和紅色通道的隱射表GreenMap和RedMap。
????? 最后一步,對各通道圖像數(shù)據(jù)進(jìn)行隱射。
1?????For?Y?=?0?To?Height?-?12?????????Speed?=?Y?*?Stride
3?????????For?X?=?0?To?Width?-?1
4?????????????ImageData(Speed)?=?BlueMap(ImageData(Speed))
5?????????????ImageData(Speed?+?1)?=?GreenMap(ImageData(Speed?+?1))
6?????????????ImageData(Speed?+?2)?=?RedMap(ImageData(Speed?+?2))
7?????????????Speed?=?Speed?+?3
8?????????Next
9?????Next
?????? 自動(dòng)色階完成,下面我們談?wù)勛詣?dòng)對比度的不同。
???????在計(jì)算完各通道對應(yīng)的上下限值后,自動(dòng)對比度算法首先獲取三個(gè)通道下限值的最小值,以及上限值的最大值,如下代碼:
?1?????If?MinBlue?<?MinGreen?Then?2?????????Min?=?MinBlue
?3?????Else
?4?????????Min?=?MinGreen
?5?????End?If
?6?????If?Min?>?MinRed?Then?Min?=?MinRed
?7?????
?8?????If?MaxBlue?>?MaxGreen?Then
?9?????????Max?=?MaxBlue
10?????Else
11?????????Max?=?MaxGreen
12?????End?If
13?????If?Max?<?MaxRed?Then?Max?=?MaxRed
? 然后以此為新的上下限,計(jì)算隱射表。
1?????For?Y?=?0?To?2552?????????If?Y?<=?Min?Then
3?????????????Map(Y)?=?0
4?????????ElseIf?Y?>?Max?Then
5?????????????Map(Y)?=?255
6?????????Else
7?????????????Map(Y)?=?(Y?-?Min)?/?(Max?-?Min)?*?255??????'線性隱射
8?????????End?If
9?????Next
????? 最后,以這個(gè)隱射表分別對紅綠藍(lán)通道進(jìn)行處理。
1?????For?Y?=?0?To?Height?-?12?????????Speed?=?Y?*?Stride
3?????????For?X?=?0?To?Width?-?1
4?????????????ImageData(Speed)?=?Map(ImageData(Speed))
5?????????????ImageData(Speed?+?1)?=?Map(ImageData(Speed?+?1))
6?????????????ImageData(Speed?+?2)?=?Map(ImageData(Speed?+?2))
7?????????????Speed?=?Speed?+?3
8?????????Next
9?????Next
由以上過程可以看出,對于灰度圖像,由于只有一個(gè)通道,自動(dòng)對比度和自動(dòng)色階實(shí)際上算法相同,結(jié)果一樣。
?????? 對于32位圖像,這類單點(diǎn)像素處理的過程一般是無需處理Alpha通道的。
?from:?http://www.cnblogs.com/Imageshop/archive/2011/11/13/2247614.html
總結(jié)
以上是生活随笔為你收集整理的调整图像- 自动对比度、自动色阶算法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Advanced Driver Assi
- 下一篇: OGRE