目标
查找和绘制2D直方图。
介绍
在第一篇文章中,我们计算并绘制了一维直方图。 之所以称为一维,是因为我们仅考虑一个特征,即像素的灰度强度值。 但是在二维直方图中,您要考虑两个特征。 通常,它用于查找颜色直方图,其中两个特征是每个像素的色相和饱和度值。
已经有一个python示例(samples / python / color_histogram.py)用于查找颜色直方图。 我们将尝试了解如何创建这种颜色直方图,这对于理解诸如直方图反向投影之类的更多主题将很有用。
标题
OpenCV中的二维直方图
它非常简单,并且使用相同的函数cv.calcHist()进行计算。 对于颜色直方图,我们需要将图像从BGR转换为HSV。(请记住,对于一维直方图,我们从BGR转换为灰度)。对于二维直方图,其参数将进行如下修改:
channel = [0,1],因为我们需要同时处理H和S平面。
bins = [180,256] 对于H平面为180,对于S平面为256。
range = [0,180,0,256] 色相值介于0和180之间,饱和度介于0和256之间。
代码:
import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt
path = r'D:\Laboratory\Study\Computer Vision\opencv4-python\junhenghua.png'
img = cv.imread(path)
hsv = cv.cvtColor(img,cv.COLOR_BGR2HSV)
hist = cv.calcHist([img], [0, 1], None, [180, 256], [0, 180, 0, 256])
绘制二维直方图
方法1:使用cv.imshow
我们得到的结果是尺寸为80x256的二维数组。因此,可以使用cv.imshow()函数像平常一样显示它们。它将是一幅灰度图像,除非您知道不同颜色的色相值,否则不会对其中的颜色有太多了解。
方法2:使用Matplotlib
我们可以使用matplotlib.pyplot.imshow()函数绘制具有不同颜色图的2D直方图。它使我们对不同的像素密度有了更好的了解。但是,除非您知道不同颜色的色相值,否则乍一看并不能使我们知道到底是什么颜色。我还是更喜欢这种方法。它简单而更好。
注意 使用此功能时,请记住,插值法应采用最近邻以获得更好的结果
plt.imshow(hist,interpolation = 'nearest')
plt.show()
结果:
下面是其颜色直方图。X轴显示S值,Y轴显示色相。