python-opencv 图像处理基础 (四)1D直方图 2D直方图

定义

一维直方图:只考虑了一个特性,即像素的灰度值。

二维直方图:考虑两个特征,通常是色度和饱和度。

代码

opencv 二维直方图

一维的直方图使用函数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二维直方图

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博客

你可能感兴趣的:(opencv,python,图像处理,opencv)