参考书目:《OpenCV计算机视觉基础教程》–夏帮贵。
代码编写:Jupyter Notebook。



# 一维直方图:只统计像素的灰度值一个特征;
# 二维直方图:统计像素的色相和饱和度,用于查找图像的颜色直方图;

# 1.OpenCV的二维直方图
# 语法格式:hist = cv2.calcHist(image, channels, mask, histSize, ranges)
# 参数说明:
# a.hist:返回的直方图;
# b.image:指定的原图从BGR色彩空间转换为HSV色彩空间,实际参数用方括号括起来;
# c.channels:设置为[0, 1]时,表示同时处理色相和饱和度;
# d.histSize:设置BINS值为[180, 256]时,表示色相为180,饱和度为256;
# e.ranges:设置为[0, 180, 0, 256]时,表示色相值取值范围为[0, 180],饱和度的取值范围为[0, 256];
import cv2 as cv
import matplotlib.pyplot as plt

img1 = cv.imread("apollo_car.JPG")
img2 = cv.cvtColor(img1, cv.COLOR_BGR2HSV)

hist = cv.calcHist([img2], [0, 1], None, [180, 256], [0, 180, 0, 256])

cv.imshow("apollo", img1)
cv.imshow("calcHist", img2)
cv.imshow("hist", hist)

#plt.imshow(hist, interpolation = "nearest")
#plt.show()

cv.waitKey(0)

1

# 2.Numpy中的二维直方图
# 语法格式:hist, xedges, yedges = np.histogram2D(x, y, bins, range)
# 参数说明:
# a.hist:返回的直方图;
# b.xedges:返回的x的直方图的BINS边界值;
# c.yedges:返回的y的直方图的BINS边界值;
# d.x和y为原图对应通道转换成的一维数组;
# e.bins为BINS的值,如:[180, 256];
# f.range:像素值范围,格式为:[[0, 180], [0, 256]];
import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt

img1 = cv.imread("apollo_car.JPG")
img2 = cv.cvtColor(img1, cv.COLOR_BGR2HSV)

h, s, v = cv.split(img2)
hist, x, y = np.histogram2d(h.ravel(), s.ravel(), [180, 256], [[0, 180], [0, 256]])

cv.imshow("apollo", img1)
cv.imshow("apollo_hsv", img2)
cv.imshow("apollo_hist", hist)

plt.imshow(hist, interpolation = "nearest")
plt.show()
cv.waitKey(0)

2

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐