一维直方图:只考虑了一个特性,即像素的灰度值。
二维直方图:考虑两个特征,通常是色度和饱和度。
一维的直方图使用函数cv2.calcHist()进行计算,从BGR转换成灰度图。
二位直方图使用相同的函数cv2.calcHist()进行计算。对于颜色直方图,需要将图像从RGB转换为HSV。对于2D直方图,其参数将被修改如下:
通道=0,1,因为需要同时处理H和S平面。
用于H平面的bin=180,以及256的S平面。
范围在[0,180,0,256]色值在0-180之间,饱和度在0-256之间。
X 轴显示S 值,Y 轴显示H 值。
import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt
img = cv.imread('home.jpg')
hsv = cv.cvtColor(img,cv.COLOR_BGR2HSV)
hist = cv.calcHist([hsv], [0, 1], None, [180, 256], [0, 180, 0, 256])
plt.imshow(hist,interpolation='nearest')
plt.show()
Numpy还提供了一个特定的功能:np.histogram2d()。(记住,对于一维的直方图,我们使用了np.histogram()。
第一个参数是H平面,第二个是S平面,第三个是每个箱子的数量,第四个是它们的范围。
import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt
img = cv.imread('home.jpg')
hsv = cv.cvtColor(img,cv.COLOR_BGR2HSV)
hist, xbins, ybins = np.histogram2d(h.ravel(),s.ravel(),[180,256],[[0,180],[0,256]])
方法-1:使用cv.imshow()
我们得到的结果是一个大小为180x256的二维数组。所以我们可以像往常一样,使用cv.imshow()函数来显示它们。它将是一个灰度图像,它不会给出太多的颜色,除非你知道不同颜色的色调值。
方法-2:使用Matplotlib
我们可以使用matplotlib.pyplot.imshow()函数来绘制带有不同颜色映射的2D直方图。它给我们提供了一个更好的关于不同像素密度的概念。但这也不能让我们知道第一眼看到的是什么颜色,除非你知道不同颜色的色调值。我还是喜欢这种方法。这很简单,也很好。
请注意:在使用这个函数时,请记住,插值标记应该是最接近于更好结果的。
参考:
1、python-opencv Tutorials 一码人翻译(25)图像处理---- --直方图----2d直方图_一码人的博客-CSDN博客