直方圖

前言

直方圖,又稱質量分佈圖,是一種統計報告圖。「巴巴拉」掉書袋之類的名詞解釋就不在這裏費話了,直方圖在程序上應該最直接的應該是圖片處理。下面介紹下直方圖在圖片上的應用。html

1. 圖片亮度直方圖繪製

RGBA, 三原色的顏色表示法。R:red(紅色)、G:green(綠色)、B:blue(藍色)、A:alpha(透明度),最大值爲255,最小值爲0。例如:rbga(0,0,0,1):黑色,透明度爲1;rbga(255,0,0,1):紅色,透明度爲1。git

咱們能夠利用程序提供的API輕鬆獲取圖片的每一個像素點的RGBA的值(canvas getImageData() 方法),獲取RGBA值後,咱們又如何獲得圖片的亮度數據呢?github

亮度 = 0.299*R + 0.587*G + 0.114*B

獲得圖片的亮度數據後,咱們開始繪製圖片的直方圖:canvas

X軸:由上公式可知,亮度最大值爲255,最小值爲0,定X軸最大值爲255,最小值爲0,間隔爲1。
Y軸:統計每一個亮度點出現的次數。ui

如今,圖片亮度的直方圖繪製完成。code

2. 直方圖均衡化

繪製完直方圖後,一般會發現,直方圖的亮度分佈並不會一條平整的線,而直方圖均衡化,最直觀的做用,就是均勻分佈,將這條線儘可能平整。htm

優勢:實現對比度的加強。
缺點:變換後圖像的灰度級減小,某些細節消失;某些圖像,如直方圖有高峯,經處理後對比度不天然的過度加強。圖片

實現過程:圖片處理

1. 亮度係數 = 當前亮度及小於當前亮度的總個數 / 亮度總個數
2. 均衡化後的亮度 = 亮度係數 * 當前亮度

當前亮度及小於當前亮度的總個數: 小於或等於X軸某點的Y值的總和
亮度總個數: Y值的總和

經過上面兩步,修改每一個點的亮度值,咱們就能夠獲得直方圖均衡化後的曲線圖,進而改變圖片。get

3. 直方圖拉伸

亮度直方圖中有時亮度點會集中在某段區間,直方圖拉伸會將亮度均拉伸到咱們想要的區域,是一種線性拉伸。

實現過程:

1. 肯定亮度直方圖區間,得最小值min,最大值max。
2. 肯定拉伸的區間(0-255),通常取255,定爲section。
3. 拉伸後的亮度 = section * ((當前亮度 - min) / (max - min))

以上能夠獲得每一個點的修正過的亮度值。

結尾

上面只是乾巴巴的文字,你們有興趣能夠看到我在github上的demo示例。
直方圖

相關文章
相關標籤/搜索