- 圖像直方圖的兩個基本屬性:range[0, 256]和bins(組塊)
- 直方圖無空間資訊
- 中間灰階級像素多,動态範圍小,圖像對比度低
- 直方圖均勻分布時圖像最清晰 圖像的直方圖是用來表現圖像中亮度分布的直方圖,給出的是圖像中某個亮度或者某個範圍亮度下共有幾個像素,即統計一幅圖某個亮度像素數量。
b
i
n
s
i
z
e
=
圖
像
中
不
同
像
素
值
的
個
數
b
i
n
的
數
目
bin_{size}=\frac{圖像中不同像素值的個數}{bin的數目}
binsize=bin的數目圖像中不同像素值的個數
方法一:利用matplotlib
import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt
def histogram_demo(image):
plt.hist(image.ravel(), 256, [0, 256])#ravel函數功能是将多元數組降為一維數組
plt.show()
image = cv.imread('./data/lena.jpg', 1)
cv.imshow('souce image', image)
histogram_demo(image)
cv.waitKey(0)
cv.destroyAllWindows()
- numpy的ravel函數功能是将多元數組降為一維數組
- hist函數原型:
hist(x, bins=None, range=None, density=None, weights=None, cumulative=False, bottom=None, histtype='bar', align='mid', orientation='vertical', rwidth=None, log=False, color=None, label=None, stacked=False, normed=None, hold=None, data=None, **kwargs)
方法二: 利用OpenCV的API
def image_hist(image): #畫三通道圖像的直方圖
color = ("blue", "green", "red")#畫筆顔色的值可以為大寫或小寫或隻寫首字母或大小寫混合
for i, color in enumerate(color):
hist = cv.calcHist([image], [i], None, [256], [0, 256])
plt.plot(hist, color=color)
plt.xlim([0, 256])
plt.show()
image = cv.imread('./data/lena.jpg', 1)
cv.imshow('souce image', image)
image_hist(image)
cv.waitKey(0)
cv.destroyAllWindows()
calcHist(images, channels, mask, histSize, ranges[, hist[, accumulate]])
- images參數表示輸入圖像,傳入時應該用中括号[ ]括起來
- channels參數表示傳入圖像的通道,如果是灰階圖像,那就不用說了,隻有一個通道,值為0,如果是彩色圖像(有3個通道),那麼值為0,1,2,中選擇一個,對應着BGR各個通道。這個值也得用[ ]傳入。
- mask參數表示掩膜圖像。如果統計整幅圖,那麼為None。主要是如果要統計部分圖的直方圖,就得構造相應的掩膜來計算。
- histSize參數表示灰階級的個數,需要中括号,比如[256]
- ranges參數表示像素值的範圍,通常[0,256]。此外,假如channels為[0,1],ranges為[0,256,0,180],則代表0通道範圍是0-256,1通道範圍0-180。
- hist參數表示計算出來的直方圖。