直方圖(histogram)也叫柱狀圖,是一種統(tǒng)計報告圖,由一系列高度不等的縱向條紋表示數(shù)據(jù)分布的情況。
假設(shè)我們有一堆硬幣,如下圖所示,我們想知道一共有多少錢。
我們當(dāng)然可以一枚一枚地數(shù),但這樣如果硬幣多了可能會搞亂,因此我們需要先把硬幣分類,然后分別統(tǒng)計每種硬幣的數(shù)量。
把統(tǒng)計的結(jié)果圖示出來,就成了直方圖。下圖的橫向數(shù)軸標(biāo)示出硬幣的面額(kind of coins),縱向標(biāo)示出硬幣的數(shù)量(number of coins)。
圖像的直方圖
以灰度圖為例,假設(shè)我們的圖中一共只有0,1,2,3,4,5,6,7這8種灰度,0代表黑色,7代表白色,其它數(shù)字代表0~7之間不同深淺的灰度。
統(tǒng)計的結(jié)果如下,橫軸標(biāo)示灰度級別(0~7),縱軸標(biāo)示每種灰度的數(shù)量。
photoshop(ps)中的顯示。
|||
直方圖統(tǒng)計數(shù)據(jù)
photoshop cs提供了動態(tài)的直方圖面板,cs之前的版本要通過圖象>直方圖來察看。
橫軸標(biāo)示亮度值(0~255),縱軸標(biāo)示每種像素的數(shù)量。
像素(pixels) - 圖像的大小,圖像的像素總數(shù)。[5*3=15]
色階、數(shù)量、百分位這三項(xiàng)根據(jù)鼠標(biāo)指針的位置來顯示橫坐標(biāo)當(dāng)前位置的統(tǒng)計數(shù)據(jù)。
色階(level) - 鼠標(biāo)指針?biāo)谖恢玫牧炼戎?,亮度值范圍?~255。[181]
數(shù)量(count) - 鼠標(biāo)指針?biāo)谖恢玫南袼財?shù)量。[4]
百分位(percentile) - 從最左邊到鼠標(biāo)指針位置的所有像素數(shù)量÷圖像像素總數(shù)。[(1+2+1+2+3+4)/15 = 13/15 = 0.8667 = 86.67%]
當(dāng)鼠標(biāo)拖動,選中直方圖的一段范圍時,色階、數(shù)量、百分位將顯示選中范圍的統(tǒng)計數(shù)據(jù)。
下面舉個簡單的例子來說明平均值、標(biāo)準(zhǔn)偏差、中間值。
例如圖像a只有4個像素,亮度分別是200、50、100、200。
平均值(算術(shù)平均數(shù),mean,average) - 圖像的平均亮度值,高于128偏亮,低于128偏暗。平均值的算法是:圖像的亮度總值÷圖像像素總數(shù)。
平均值公式:
公式中,(讀作x撥,x-bar)代表x的平均值,∑(讀作西格瑪,sigma)代表總和,n代表x的總數(shù)。
[圖像a的平均值 = (200+50+100+200)/4 = 550/4 = 137.5]
中間值(中值,中位數(shù),median) - 中間值是把圖像所有像素的亮度值通過從從小到大排列后,位置處在中間的數(shù)。(如果有偶數(shù)個像素,就有兩個位于中間的數(shù),取前面的一個)
[圖像a的中間值:亮度排序后50<=100<=200<=200,100和200是位于中間的,取前面的100作為中間值。]
標(biāo)準(zhǔn)偏差(標(biāo)準(zhǔn)差,std dev,standard deviation,sample variance) - 指圖像所有像素的亮度值與平均值之間的偏離幅度。標(biāo)準(zhǔn)偏差越小,圖像的亮度變化就越小,反之亮度變化就越大。
標(biāo)準(zhǔn)偏差公式:
圖像a的標(biāo)準(zhǔn)偏差:(已知平均值 =137.5)
標(biāo)準(zhǔn)方差 s^2 = ((200-137.5)^2+(50-137.5)^2+(100-137.5)^2+(200-137.5)^2)/(4-1) = (62.5^2+(-87.5)^2+(-37.5)^2+62.52)/3 = (3906.25+7656.25+1406.25+3906.25)/3 = 16875/3 = 5625
標(biāo)準(zhǔn)偏差 s = 5625開平方 = 75
|||
通道
photoshop可以根據(jù)不同的通道來顯示直方圖,這些通道分別是rgb、紅、綠、藍(lán)、亮度和顏色,它們分別統(tǒng)計了不同的顏色數(shù)據(jù)。
下面舉例來說明這些通道代表的含義。例如圖像b只有3個像素,顏色值分別是rgb(0,10,20)、rgb(30,40,50)、rgb(60,70,80)。
紅、綠、藍(lán)通道 - 紅色通道只統(tǒng)計顏色的r值,對于圖像b只統(tǒng)計0、30、60這三個數(shù)字,然后根據(jù)這三個數(shù)字繪出直方圖。綠色和藍(lán)色通道也用相同的方法處理。
rgb通道 - 統(tǒng)計圖像的所有rgb數(shù)據(jù)。對于圖像b,要統(tǒng)計0、10、20、30、40、50、60、70、80這9個數(shù)字。
亮度通道 - 先用亮度公式gray=0.3*r+0.59*g+0.11*b求出每個像素的亮度值,然后對這些亮度值進(jìn)行統(tǒng)計。對于圖像b,第一個像素的亮度值為0.3*0+0.59*10+0.11*20=8.1,用同樣的方法求出另兩個像素的亮度值分別為38.1和68.1,然后四舍五入取整,對8、38、68這三個數(shù)字進(jìn)行統(tǒng)計。
[注] 有些軟件用gray=(r+g+b)/3作為亮度公式進(jìn)行統(tǒng)計,例如gimp。
顏色通道 - 把紅、綠、藍(lán)和rgb通道的統(tǒng)計數(shù)據(jù)繪制在同一幅圖中。
|||
高速緩存級別(cache level)
為什么要用緩存(cache)?
我們在處理一些超大的圖片時,會因?yàn)橄袼財?shù)量過多而導(dǎo)致每一步操作都很慢,為了提高圖片的顯示與刷新速度,photoshop利用圖片的縮小版本來進(jìn)行計算并顯示。
當(dāng)你載入一幅圖片時,photoshop會自動生成許多這幅圖片的縮小版本放在臨時文件中,這些縮小圖就是高速緩存,其中有縮小到50%的、25%的、12.5%的等等。當(dāng)你把視圖縮小時,比如縮小到25%,photoshop就利用25%那張緩存小圖的計算結(jié)果來更新視圖。
緩存小圖的不同縮小比例代表不同的緩存級別。緩存級別1為100%的原圖,級別2為50%的小圖,級別3為25%的小圖,以此類推。
若要設(shè)定緩存級別,可以選擇菜單編輯>預(yù)置>內(nèi)存與圖像高速緩存(edit > preferences > memory and image cache)。photoshop cs2的緩存級別默認(rèn)值為6,適用于處理高質(zhì)量的數(shù)碼相機(jī)照片。
[注] photoshop cs2之前的版本有一個“使用直方圖高速緩存”(use cache for histogram)的選項(xiàng),可以提高直方圖的繪制速度,但會降低精確度。建議不要勾選此項(xiàng),否則當(dāng)你縮小視圖時,photoshop就會使用相應(yīng)的緩存小圖來生成直方圖。
緩存級別的算法
取上一級的四個相鄰像素的平均值來獲得一個像素,像素數(shù)是它上一級的1/4。
例如有張圖片的大小是8*8,緩存級別2的大小為4*4,級別3為2*2,級別4為1*1。
下圖是一張2*2像素的棋盤格圖片,緩存級別2的灰度值取原圖的平均值(0+255+255+0)/4=500/4=128。
直方圖面板中的緩存級別
當(dāng)圖片較大時,為了提高直方圖的刷新速度,photoshop會自動選擇適當(dāng)?shù)木彺婕墑e來生成直方圖。
現(xiàn)在來研究一下直方圖面板中的緩存級別。新建一個2*2像素的圖片,畫成棋盤格圖案,然后執(zhí)行編輯>定義圖案。
新建一個1000*1000像素的圖片,灰度模式。
使用編輯>填充命令和前面定義的圖案來填充這張圖片。
這時看一下直方圖面板,會發(fā)現(xiàn)右上角多了一個警告圖標(biāo)。這是緩存級別2的圖片。通過直方圖我們可以看出緩存級別2是張純灰色的圖片,灰度值128,像素數(shù)量250000,正好是原圖的1/4。
單擊那個警告圖標(biāo),現(xiàn)在已經(jīng)更新為原圖的直方圖。像素數(shù)量為1000*1000=1000000,有0和255兩種灰度,平均值為255/2=127.50。這些都是原圖的正確數(shù)據(jù),正是我們所期望的。
對于一般的圖像,為了提高速度而使用緩存生成直方圖基本上是可行的,但要注意原圖相鄰像素的亮度變化越大,緩存小圖造成的誤差就越大。
|||
直方圖的y軸范圍
前面我們已經(jīng)知道,photoshop直方圖的x軸標(biāo)示亮度值,y軸標(biāo)示每種像素的數(shù)量。x軸的數(shù)值范圍是0~255,現(xiàn)在來討論一下y軸的范圍。
以bracket.bmp的藍(lán)色通道為例,注意看下圖中所顯示的數(shù)據(jù)。
這幅圖像的像素總數(shù)為19200。當(dāng)鼠標(biāo)光標(biāo)移到直方圖最左邊(色階為0)時,顯示出數(shù)量的最大值684,這個最大值應(yīng)該就是最長的一條豎線。當(dāng)鼠標(biāo)向右移動到色階2時,數(shù)量為526,但豎線仍是同樣長度,這說明色階0的豎線被photoshop裁去了一部分。那么photoshop是如何確定該裁去多少呢?
我們可以給y軸一個固定的范圍,例如0~1120,這時的直方圖顯示如下??梢钥闯?,最大值684以上的部分都是空白,而圖形下部很纖細(xì),看不清細(xì)節(jié)。
我們也可以把y軸的范圍縮小到0~135,這時圖形被縱向拉長了,我們可以看出很多圖形下部的細(xì)節(jié),但圖形的上部有太多被裁掉了。
比較常見的一種方法是把圖形縮短或拉長到正好適合視圖的大小,此時范圍是0~684(最大值)。大多數(shù)軟件都使用這種方法,photoshop在一般情況下也是這樣。
上面的方法有一個最大的缺陷就是如果有幾條特別長的豎線的話,其它的豎線會變得很短而不利于我們觀察它們的細(xì)節(jié),所以photoshop會把這些長豎線裁去一些。
photoshop確定y軸范圍的原則是如果最大值超過像素總數(shù)的64分之一,那么就用像素總數(shù)÷64作為y軸范圍的上限,否則以最大值作為上限。
bracket.bmp的像素總數(shù)為19200,19200/64=300,因?yàn)樽畲笾?84>300,所以y軸的范圍是0~300。
|||
直方圖的算法
看到論壇上有人認(rèn)為計算直方圖開銷最大的是標(biāo)準(zhǔn)偏差,還有人認(rèn)為有必要取消標(biāo)準(zhǔn)偏差的顯示項(xiàng)以提高速度。其實(shí)標(biāo)準(zhǔn)偏差的計算量并不大,就看你怎么去計算了。前面講過的一些算法的確會讓人誤以為計算這些數(shù)據(jù)時要對每個像素都進(jìn)行加減乘除乘方等運(yùn)算,所以我覺得有必要討論一下直方圖的具體計算過程。
要繪制直方圖,首先要建立一個儲存每種灰度數(shù)量的數(shù)據(jù)表(graytable),graytable是一個大小為256的數(shù)組。然后要對圖像的每一個像素進(jìn)行統(tǒng)計,把每種灰度的像素數(shù)量記錄到graytable中。這一步是必須的,不能偷工減料,這部分的計算量與像素的數(shù)量成正比,因此圖像越大,計算的速度就越慢。要想提高速度,唯一的方法就是使用緩存中的小圖進(jìn)行計算,但這樣會降低精確度,不過對于實(shí)時更新的動態(tài)直方圖來說,這么做還是很有必要的。
數(shù)據(jù)表graytable準(zhǔn)備好了已后,平均值、中間值和標(biāo)準(zhǔn)偏差都可以利用graytable里的數(shù)據(jù)來計算,也就是說沒必要再對每個像素進(jìn)行計算了。無論圖像有多大,graytable里都只存放256個數(shù)字,所以計算起來相當(dāng)快。
舉例來說,例如graytable中存放了以下的數(shù)據(jù)。
平均值 = (0*3 + 1*2 + 2*1 + 3*5 + 0 + 255*1) / (3+2+1+5+0+1) = 274/12 = 22.8
看到了吧,用乘法就行了,灰度值×數(shù)量再相加。標(biāo)準(zhǔn)偏差也是用類似的方法計算。graytable的灰度值是從小到大排列的,所以計算中間值也很方便。
對于動態(tài)直方圖來說,也可以利用graytable來優(yōu)化。有些時候,我們沒有必要重新統(tǒng)計整幅圖像的像素來更新直方圖,只要把先前直方圖的graytable里的數(shù)據(jù)調(diào)換一下位置就行了,這種方法僅限于單幅圖像單像素的處理(點(diǎn)運(yùn)算)。例如做反色運(yùn)算后,新的直方圖其實(shí)就是把原來的直方圖左右翻轉(zhuǎn)了一下。這樣無論圖像有多大,都可以做到精確的實(shí)時更新。
photoshop圖像菜單的功能幾乎都可以使用這種優(yōu)化,但photoshop目前還沒做到這一點(diǎn),估計是怕麻煩吧。一些高畫質(zhì)數(shù)碼照片處理軟件可以考慮把這個功能加進(jìn)去。
上文書轉(zhuǎn)載自:灰鹿色彩筆記 http://hi.baidu.com/graydeer 感謝灰鹿同志超一流的教學(xué)水準(zhǔn)!
-----------------------------------------------------------------------------------------------
下文書寥寥數(shù)字,卻更堪稱經(jīng)典。
“直方圖”里的色階為什么只有225級?而不是255
相關(guān)引用 http://bbs.blueidea.com/thread-2892954-1-1.html
關(guān)于直方圖的顯示225的錯誤修改方法:
如果發(fā)現(xiàn)了有顯示錯誤的現(xiàn)象,先關(guān)閉photoshop,用記事本打開photoshop安裝目錄下required子目錄中的tw10428.dat文件。
在打開的tw10428.dat中查找"$$$/histogrampalette/stattext/cache=高速緩存級別:",其位于第7667行。將高速級別4個字刪除,只保留緩存2字。保存后退出。再啟動photoshop即可解決。刪除和保留的文字可自行決定,但必須至少刪除3個漢字才能解決問題?! ?/p>
注意:
修改tw10428.dat文件是photoshop中文界面的字符文件,改動不當(dāng)可能造成界面顯示錯誤。如果刪除該文件或移動出required目錄,photoshop將以英文界面啟動。因此請做好備份,謹(jǐn)慎操作。如果錯誤操作且無法挽回,必須重新安裝photoshop。
新聞熱點(diǎn)
疑難解答