直方圖
直方圖簡單來說就是圖像中每個(gè)像素值的個(gè)數(shù)統(tǒng)計(jì),比如說一副灰度圖中像素值為0的有多少個(gè)具篇,1的有多少個(gè)……直方圖是一種分析圖像的手段:
直方圖計(jì)算
opencv庫計(jì)算直方圖
使用 cv.calcHist(images, channels, mask, histSize, ranges) 計(jì)算,其中:
參數(shù)1:要計(jì)算的原圖驱显,以方括號的形式傳入诗芜,如:[img]
參數(shù)2:選擇圖像的某個(gè)通道,計(jì)算直方圖埃疫,灰度圖像寫[0]
參數(shù)3:要計(jì)算的區(qū)域伏恐,計(jì)算整幅圖的話,寫None
參數(shù)4:直方圖橫坐標(biāo)數(shù)目
參數(shù)5:要計(jì)算的像素范圍栓霜,一般為[0,255]
例如:hist = cv.calcHist([img], [0], None, [256], [0, 255])
numpy庫計(jì)算直方圖
可用Numpy中的函數(shù)計(jì)算直方圖翠桦,其中ravel()函數(shù)將二維矩陣展平變成一維數(shù)組:
hist, bins = np.histogram(img.ravel(), 255, [0, 255])
另一種更高效的方式:
hist = np.bincount(img.ravel(), minlength=256)
直方圖繪制
Matplotlib庫自帶了一個(gè)計(jì)算并繪制直方圖的功能,不需要用到上面的函數(shù):
plt.hist(img.ravel(), 256, [0, 255])
plt.show()
當(dāng)然胳蛮,也可以用前面計(jì)算出來的結(jié)果繪制:
plt.plot(hist)
plt.show()
實(shí)驗(yàn)
import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt
img = cv.imread('hist.jpg', 0)
hist = cv.calcHist([img], [0], None, [256], [0, 255])
plt.plot(hist)
plt.show()
實(shí)驗(yàn)結(jié)果
從直方圖上可以看到圖片的大部分區(qū)域集中在150偏白的附近销凑,這其實(shí)并不是很好的效果丛晌,下面我們來看看如何改善它。
直方圖均衡化
一副效果好的圖像通常在直方圖上的分布比較均勻斗幼,直方圖均衡化就是用來改善圖像的全局亮度和對比度澎蛛。其實(shí)從觀感上就可以發(fā)現(xiàn),前面那幅圖對比度不高孟岛,偏灰白瓶竭。對均衡化算法感興趣的同學(xué)可參考:直方圖均衡化算法及python實(shí)現(xiàn)
opencv中實(shí)現(xiàn)圖像直方圖均衡化
equ = cv.equalizeHist(img)
import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt
img = cv.imread('hist.jpg', 0)
img_eq = cv.equalizeHist(img)
hist = cv.calcHist([img], [0], None, [256], [0, 255])
hist_eq = cv.calcHist([img_eq], [0], None, [256], [0,255])
plt.figure(1)
plt.subplot(2,2,1)
plt.imshow(img,cmap='gray')
plt.subplot(2,2,2)
plt.imshow(img_eq,cmap='gray')
plt.subplot(2,2,3)
plt.plot(hist)
plt.subplot(2,2,4)
plt.plot(hist_eq)
plt.show()
matlab圖像直方圖均衡化
請參考一篇優(yōu)秀個(gè)文章:matlab實(shí)現(xiàn)圖像直方圖均衡化
直方圖自適應(yīng)均衡化
不難看出來渠羞,直方圖均衡化是應(yīng)用于整幅圖片的斤贰,會(huì)有什么問題呢?看下圖:
很明顯荧恍,因?yàn)槿终{(diào)整亮度和對比度的原因,臉部太亮屯吊,大部分細(xì)節(jié)都丟失了送巡。
自適應(yīng)均衡化就是用來解決這一問題的:它在每一個(gè)小區(qū)域內(nèi)(默認(rèn)8×8)進(jìn)行直方圖均衡化。當(dāng)然盒卸,如果有噪點(diǎn)的話骗爆,噪點(diǎn)會(huì)被放大,需要對小區(qū)域內(nèi)的對比度進(jìn)行了限制蔽介,所以這個(gè)算法全稱叫:對比度受限的自適應(yīng)直方圖均衡化CLAHE(Contrast Limited Adaptive Histogram Equalization)摘投。
實(shí)現(xiàn)直方圖自適應(yīng)均衡化
import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt
img = cv.imread('tsukuba.jpg', 0)
clahe = cv.createCLAHE(clipLimit=2.0, tileGridSize=(8, 8))
cl1 = clahe.apply(img)
plt.subplot(1,2,1)
plt.imshow(img,cmap='gray')
plt.title('Original')
plt.xticks([]),plt.yticks([])
plt.subplot(1,2,2)
plt.imshow(cl1,cmap='gray')
plt.title('Adaptive Histogram Equalization')
plt.xticks([]),plt.yticks([])
plt.show()