一、圖像直方圖
?直方圖可以讓你了解總體的圖像像素強度分布,其X軸為像素值(一般范圍為0~255),在Y軸上為圖像中具有該像素值像素數(shù)。
- 橫坐標: 圖像中各個像素點的灰度級.
- 縱坐標: 具有該灰度級的像素個數(shù).
?
畫出上圖的直方圖:
或者以柱狀圖的形式:
- 歸一化直方圖
? - 橫坐標: 圖像中各個像素點的灰度級
? - 縱坐標: 出現(xiàn)這個灰度級的概率
- **直方圖術(shù)語**:?
? `dims`:需要統(tǒng)計的特征的數(shù)目。例如:`dims=1`,表示我們僅統(tǒng)計灰度值。?
? `bins`:每個特征空間子區(qū)段的數(shù)目。?
? `range`:統(tǒng)計灰度值的范圍, 一般為[0, 255]
1.1?使用OpenCV統(tǒng)計直方圖
- calcHist(images, channels, mask, histSize, ranges[, hist[, accumulate]])
? - images: 原始圖像
? - channels: 指定通道.
? ? - 需要用中括號括起來, 輸入圖像是灰度圖像是, 值是[0], 彩色圖像可以是[0], [1], [2], 分別對應(yīng)B,G,R.
? - mask: 掩碼圖像
? ? - 統(tǒng)計整幅圖像的直方圖, 設(shè)為None
? ? - 統(tǒng)計圖像某一部分的直方圖時, 需要掩碼圖像.
- histSize: BINS的數(shù)量
?? ? - 需要用中括號括起來, 例如[256]??
- ranges: 像素值范圍, 例如[0, 255]
?- accumulate: 累積標識
? ? - 默認值為False
? ? - 如果被設(shè)置為True, 則直方圖在開始分配時不會被清零.
? ? - 該參數(shù)允許從多個對象中計算單個直方圖, 或者用于實時更新直方圖.
? ? - 多個直方圖的累積結(jié)果, 用于對一組圖像計算直方圖.?
import cv2
import matplotlib.pyplot as plt
lena = cv2.imread('./lena.png')
hist = cv2.calcHist([lena], [0], None, [256], [0, 255])
print(type(hist))
print(hist.size)
print(hist.shape)
print(hist)
1.2?使用OpenCV繪制直方圖
可以利用matplotlib把OpenCV統(tǒng)計得到的直方圖繪制出來.
import cv2
import matplotlib.pyplot as plt
lena = cv2.imread('./lena.png')
histb = cv2.calcHist([lena], [0], None, [256], [0, 255])
histg = cv2.calcHist([lena], [1], None, [256], [0, 255])
histr = cv2.calcHist([lena], [2], None, [256], [0, 255])
plt.plot(histb, color='b')
plt.plot(histg, color='g')
plt.plot(histr, color='r')
plt.show()
?
?
1.3??使用掩膜的直方圖
- 掩膜
?
- 如何生成掩膜
? - 先生成一個全黑的和原始圖片大小一樣大的圖片. ?
mask = np.zeros(image.shape, np.uint8)
? - 將想要的區(qū)域通過索引方式設(shè)置為255.
mask[100:200,?200: 300] = 255? #255 白色
import cv2
import matplotlib.pyplot as plt
lena = cv2.imread('./lena.png')
gray = cv2.cvtColor(lena, cv2.COLOR_BGR2GRAY)
mask = np.zeros(gray.shape, np.uint8)
mask[200:400, 200: 400] = 255
hist_mask = cv2.calcHist([gray], [0], mask, [256], [0, 255])
hist_img = cv2.calcHist([gray], [0], None, [256], [0, 255])
plt.plot(hist_mask)
plt.plot(hist_img)
cv2.imshow('mask', cv2.bitwise_and(gray, gray, mask=mask))
cv2.waitKey(0)
cv2.destroyAllWindows()
二、直方圖均衡化原理
直方圖均衡化是通過拉伸像素強度的分布范圍,使得在0~255灰階上的分布更加均衡,提高了圖像的對比度,達到改善圖像主觀視覺效果的目的。對比度較低的圖像適合使用直方圖均衡化方法來增強圖像細節(jié)。
?
原理:
1. 計算累計直方圖
累計直方圖:對概率進行累計
2. 累計直方圖進行區(qū)間轉(zhuǎn)換
3. 在累計直方圖中, 概率相近的原始值, 會被處理為相同的值
- equalizeHist(src[, dst])
? - src 原圖像
? - dst 目標圖像, 即處理結(jié)果
import cv2
import matplotlib.pyplot as plt
lena = cv2.imread('./lena.png')
gray = cv2.cvtColor(lena, cv2.COLOR_BGR2GRAY)
# lena變黑
gray_dark = gray - 40
# lena變亮
gray_bright = gray + 40
# 查看各自的直方圖
hist_gray = cv2.calcHist([gray], [0], None, [256], [0, 255])
hist_dark = cv2.calcHist([gray_dark], [0], None, [256], [0, 255])
hist_bright = cv2.calcHist([gray_bright], [0], None, [256], [0, 255])
plt.plot(hist_gray)
plt.plot(hist_dark)
plt.plot(hist_bright)
# 進行均衡化處理
dark_equ = cv2.equalizeHist(gray_dark)
bright_equ = cv2.equalizeHist(gray_bright)
cv2.imshow('gray_dark', np.hstack((gray_dark, dark_equ)))
cv2.imshow('gray_bright', np.hstack((gray_bright, bright_equ)))
cv2.waitKey(0)
cv2.destroyAllWindows()
文章來源:http://www.zghlxwxcb.cn/news/detail-708868.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-708868.html
到了這里,關(guān)于OpenCV 12(圖像直方圖)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!