cv2.calcHist
函数是 OpenCV 库中用于计算图像直方图的函数。直方图是一种统计图像中像素值分布的工具,它可以提供图像的亮度、颜色等信息。这个函数可以用于灰度图像和彩色图像。
函数语法
hist = cv2.calcHist(images, channels, mask, histSize, ranges, accumulate=False)
参数
- images: 图像数组或图像列表。对于单通道图像(如灰度图像),只需一个图像;对于多通道图像(如彩色图像),可以传入多个图像。
- channels: 需要计算直方图的通道索引列表。对于灰度图像,通常传入
[0]
;对于彩色图像,可以传入[0]
(蓝色通道)、[1]
(绿色通道)、[2]
(红色通道)。 - mask: 可选参数,用于指定计算直方图的区域。如果为
None
,则计算整个图像的直方图。如果提供了掩码图像,直方图将只计算掩码非零区域的像素值。 - histSize: 直方图的大小,即直方图的“bin”数量。对于灰度图像,通常设置为
[256]
,因为像素值的范围是 0 到 255。 - ranges: 像素值的范围。对于灰度图像,通常设置为
[0, 256]
。 - accumulate: 可选参数,用于指定是否在现有的直方图上累加。默认为
False
。
返回值
- hist: 计算得到的直方图,是一个一维数组。
代码步骤
-
读取灰度图像:
- 使用
cv2.imread
读取图像,并将其转换为灰度图像。 cv2.IMREAD_GRAYSCALE
指定读取图像时将其转换为灰度图像。phone=cv2.imread("phone.png",cv2.IMREAD_GRAYSCALE)
- 使用
-
展平灰度图像:
- 使用
numpy.ravel
将灰度图像的二维数组展平为一维数组,以便绘制直方图。a=phone.ravel()
- 使用
-
绘制灰度图像直方图:
- 使用
matplotlib.pyplot.hist
绘制灰度图像的直方图,其中bins=256
表示将直方图分为256个区间。# 使用 matplotlib 绘制灰度图像的直方图 # bins=256 表示将直方图分为256个区间 plt.hist(a, bins=256) plt.show()
- 使用
-
计算灰度图像直方图(OpenCV方法):
- 使用
cv2.calcHist
计算灰度图像的直方图,其中直方图分为16个区间。# 使用 OpenCV 计算灰度图像的直方图 # 直方图分为16个区间 phone_hist = cv2.calcHist([phone], [0], None, [16], [0, 256])
- 使用
-
绘制灰度图像直方图(OpenCV方法):
- 使用
matplotlib.pyplot.plot
绘制计算得到的灰度图像直方图。# 绘制计算得到的灰度图像直方图 plt.plot(phone_hist) plt.show()
- 使用
-
读取彩色图像:
- 使用
cv2.imread
读取彩色图像。# 读取名为 "phone.png" 的彩色图像 img = cv2.imread("phone.png")
- 使用
-
定义颜色通道列表:
- 定义一个包含蓝色、绿色和红色通道的列表。
# 定义颜色通道的列表 color = ('b', 'g', 'r')
- 定义一个包含蓝色、绿色和红色通道的列表。
-
计算并绘制彩色图像直方图:
- 遍历每个颜色通道,使用
cv2.calcHist
计算每个通道的直方图,并将直方图分为256个区间。 - 使用
matplotlib.pyplot.plot
绘制每个通道的直方图,并使用对应的颜色绘制。# 遍历每个颜色通道 for i, col in enumerate(color):# 计算每个颜色通道的直方图# 直方图分为256个区间histr = cv2.calcHist([img], [i], None, [256], [0, 256])# 绘制每个颜色通道的直方图# 使用对应的颜色绘制plt.plot(histr, color=col)
- 遍历每个颜色通道,使用
-
显示彩色图像直方图:
- 使用
matplotlib.pyplot.show
显示绘制的彩色图像直方图。# 显示绘制的彩色图像直方图 plt.show()
- 使用
完整代码
import cv2
import matplotlib.pyplot as plt
import numpy as np# 读取名为 "phone.png" 的图像,并将其转换为灰度图像
phone = cv2.imread("phone.png", cv2.IMREAD_GRAYSCALE)# 将灰度图像的二维数组展平为一维数组
a = phone.ravel()# 使用 matplotlib 绘制灰度图像的直方图
# bins=256 表示将直方图分为256个区间
plt.hist(a, bins=256)
plt.show()# 使用 OpenCV 计算灰度图像的直方图
# 直方图分为16个区间
phone_hist = cv2.calcHist([phone], [0], None, [16], [0, 256])# 绘制计算得到的灰度图像直方图
plt.plot(phone_hist)
plt.show()# 读取名为 "phone.png" 的彩色图像
img = cv2.imread("phone.png")# 定义颜色通道的列表
color = ('b', 'g', 'r')# 遍历每个颜色通道
for i, col in enumerate(color):# 计算每个颜色通道的直方图# 直方图分为256个区间histr = cv2.calcHist([img], [i], None, [256], [0, 256])# 绘制每个颜色通道的直方图# 使用对应的颜色绘制plt.plot(histr, color=col)# 显示绘制的彩色图像直方图
plt.show()