直方圖,又稱質量分佈圖,是一種統計報告圖。「巴巴拉」掉書袋之類的名詞解釋就不在這裏費話了,直方圖在程序上應該最直接的應該是圖片處理。下面介紹下直方圖在圖片上的應用。html
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
繪製完直方圖後,一般會發現,直方圖的亮度分佈並不會一條平整的線,而直方圖均衡化,最直觀的做用,就是均勻分佈,將這條線儘可能平整。htm
優勢:實現對比度的加強。
缺點:變換後圖像的灰度級減小,某些細節消失;某些圖像,如直方圖有高峯,經處理後對比度不天然的過度加強。圖片
實現過程:圖片處理
1. 亮度係數 = 當前亮度及小於當前亮度的總個數 / 亮度總個數 2. 均衡化後的亮度 = 亮度係數 * 當前亮度 當前亮度及小於當前亮度的總個數: 小於或等於X軸某點的Y值的總和 亮度總個數: Y值的總和
經過上面兩步,修改每一個點的亮度值,咱們就能夠獲得直方圖均衡化後的曲線圖,進而改變圖片。get
亮度直方圖中有時亮度點會集中在某段區間,直方圖拉伸會將亮度均拉伸到咱們想要的區域,是一種線性拉伸。
實現過程:
1. 肯定亮度直方圖區間,得最小值min,最大值max。 2. 肯定拉伸的區間(0-255),通常取255,定爲section。 3. 拉伸後的亮度 = section * ((當前亮度 - min) / (max - min))
以上能夠獲得每一個點的修正過的亮度值。
上面只是乾巴巴的文字,你們有興趣能夠看到我在github上的demo示例。
直方圖