小言_互联网的博客

在OpenCV里实现二维直方图

547人阅读  评论(0)

目标:怎么样实现二维直方图

 

在前面我们学习过一维直方图,也有应用它来解决过很多问题。但是没有使用过二维直方图,那么它是怎么样实现,以及有什么作用呢。本文就来解决这些问题。在一维直方图里只关注了一个特征:灰度值。在二维直方图里,将要考虑两个特征,一般情况就是采用彩色图里的色调(H)和饱和度(S)。二维直方图主要应用在反向投影方面。

 

使用OpenCV实现二维直方图

跟计算一维直方图是一样,可以使用cv.calcHist()函数来计算,不过要把图像从BGR转换为HSV空间,并且要注意下面的参数:

channels = [0,1],通道参数里指明要计算H和S的直方图。

bins = [180,256],确定每个通道里直方图的分割的份数,H分为180个,S分为256个。

range = [0,180,0,256],色调H值范围为0到180,S范围为0到256。

 

有了这些参数,就可以调用这个函数:

import numpy as np

import cv2 as cv

 

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])

如果想用numpy里实现,可以最后一行代码改为:

hist, xbins, ybins = np.histogram2d(h.ravel(),s.ravel(),[180,256],[[0,180],[0,256]])

 

因此,可以使用下面例子来演示:

#python 3.7.4,opencv4.1
#蔡军生 https://blog.csdn.net/caimouse/article/details/51749579
#
import numpy as np
import cv2
from matplotlib import pyplot as plt

#读取图片
img = cv2.imread('dft6.png')
h,w = img.shape[:2]

rgb = cv2.cvtColor(img,cv2.COLOR_BGR2RGB) #转换为RGB以便正确显示
hsv = cv2.cvtColor(img,cv2.COLOR_BGR2HSV) #转换HSV
#求HSV二维直方图
hist = cv2.calcHist( [hsv], [0, 1], None, [180, 256], [0, 180, 0, 256] )

plt.subplot(121), plt.imshow(rgb) #显示原图
plt.subplot(122), plt.imshow(hist,interpolation = 'nearest')

plt.show()

cv2.waitKey(0)
cv2.destroyAllWindows()

结果输出如下:

右边是二维的直方图,X轴显示S值,Y轴显示H值,从上图可以看到黄色区域。

https://blog.csdn.net/caimouse/article/details/51749579


转载:https://blog.csdn.net/caimouse/article/details/102583100
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场