cv2.calcHist
函数是 OpenCV 库中用于计算图像直方图的函数。直方图是一种统计图像中像素值分布的工具,它可以提供图像的亮度、颜色等信息。这个函数可以用于灰度图像和彩色图像。
函数语法
python
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
指定读取图像时将其转换为灰度图像。pythonphone=cv2.imread("phone.png",cv2.IMREAD_GRAYSCALE)
展平灰度图像:
-
使用
numpy.ravel
将灰度图像的二维数组展平为一维数组,以便绘制直方图。pythona=phone.ravel()
绘制灰度图像直方图:
-
使用
matplotlib.pyplot.hist
绘制灰度图像的直方图,其中bins=256
表示将直方图分为256个区间。python# 使用 matplotlib 绘制灰度图像的直方图 # bins=256 表示将直方图分为256个区间 plt.hist(a, bins=256) plt.show()
计算灰度图像直方图(OpenCV方法):
-
使用
cv2.calcHist
计算灰度图像的直方图,其中直方图分为16个区间。python# 使用 OpenCV 计算灰度图像的直方图 # 直方图分为16个区间 phone_hist = cv2.calcHist([phone], [0], None, [16], [0, 256])
绘制灰度图像直方图(OpenCV方法):
-
使用
matplotlib.pyplot.plot
绘制计算得到的灰度图像直方图。python# 绘制计算得到的灰度图像直方图 plt.plot(phone_hist) plt.show()
读取彩色图像:
-
使用
cv2.imread
读取彩色图像。python# 读取名为 "phone.png" 的彩色图像 img = cv2.imread("phone.png")
定义颜色通道列表:
-
定义一个包含蓝色、绿色和红色通道的列表。
python# 定义颜色通道的列表 color = ('b', 'g', 'r')
计算并绘制彩色图像直方图:
-
遍历每个颜色通道,使用
cv2.calcHist
计算每个通道的直方图,并将直方图分为256个区间。 -
使用
matplotlib.pyplot.plot
绘制每个通道的直方图,并使用对应的颜色绘制。python# 遍历每个颜色通道 for i, col in enumerate(color): # 计算每个颜色通道的直方图 # 直方图分为256个区间 histr = cv2.calcHist([img], [i], None, [256], [0, 256]) # 绘制每个颜色通道的直方图 # 使用对应的颜色绘制 plt.plot(histr, color=col)
显示彩色图像直方图:
-
使用
matplotlib.pyplot.show
显示绘制的彩色图像直方图。python# 显示绘制的彩色图像直方图 plt.show()
完整代码
python
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()