如何在OpenCV Python中绘制图像的不同颜色的直方图?
介绍
OpenCV是一个广泛使用的计算机视觉库,可以进行各种各样的图像处理操作。本文将演示如何在OpenCV Python中绘制图像的不同颜色的直方图。
准备工作
在开始之前,需要安装好OpenCV,并且准备好需要绘制直方图的图像。
方法1:使用cv2.calcHist函数
OpenCV的cv2.calcHist函数可以用来计算图像在指定区域内每个像素值的数量分布。我们可以使用该函数计算出图像蓝、绿、红三个通道的直方图,从而得到一张彩色图像的不同颜色的直方图。
以下是使用cv2.calcHist计算图像直方图的示例代码:
import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('fruit.jpg')
color = ('b','g','r')
for i,col in enumerate(color):
histr = cv2.calcHist([img],[i],None,[256],[0,256])
plt.plot(histr,color = col)
plt.xlim([0,256])
plt.show()
以上代码中,我们首先使用cv2.imread函数读入图像,然后定义了一个元组color,用于存储三个通道的颜色值。接下来我们在一个for循环中依次计算每个通道的直方图,最后使用matplotlib库绘制成图像展示。
这个直方图是将三个通道的数据叠放在一起绘制的,因此看上去比较混乱,难以看清楚不同颜色的像素的数量。因此,我们需要将一个颜色通道独立绘制出来。
以下是将每个颜色通道独立绘制的示例代码:
img = cv2.imread('fruit.jpg')
color = ('b','g','r')
for i,col in enumerate(color):
histr = cv2.calcHist([img],[i],None,[256],[0,256])
plt.plot(histr,color = col)
plt.xlim([0,256])
plt.ylim([0,8000])
plt.show()
以上代码中,我们在for循环中依次计算每个颜色通道的直方图,并将其绘制出来。由于每个通道的像素数量不同,因此我们需要将y轴范围设置为合适的大小,以免像素数量较少的颜色通道的直方图被压扁。
这个直方图通过将三个通道分别绘制出来,我们可以更清晰地看到图像的不同颜色的像素数量分布情况。
方法2:使用numpy.histogram函数
除了上面介绍的cv2.calcHist函数,我们还可以使用numpy.histogram函数来计算图像直方图。
以下是使用numpy.histogram计算直方图的示例代码:
import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('fruit.jpg')
color = ('b','g','r')
for i,col in enumerate(color):
hist, bins = np.histogram(img[:,:,i].ravel(),256,[0,256])
plt.plot(hist,color = col)
plt.xlim([0,256])
plt.show()
以上代码中,我们首先使用cv2.imread函数读入图像,然后定义了一个元组color,用于存储三个通道的颜色值。接下来我们在一个for循环中依次计算每个颜色通道的直方图,这里使用了numpy.histogram函数。
numpy.histogram函数的第一个参数接受一个要处理的数组,这里我们使用的是img[:,:,i],即只处理当前颜色通道的像素值。第二个参数bin指定了直方图的分bin数,这里我们使用了256。函数返回结果包含两个值,第一个值是直方图数据,第二个值是直方图分bin的边界值。
运行以上代码我们可以得到和上一种方法相同的三个颜色通道的直方图。
结论
本文介绍了在OpenCV Python中如何绘制图像的不同颜色的直方图。我们可以使用cv2.calcHist或numpy.histogram函数来计算图像的直方图,并使用matplotlib库将结果可视化。通过绘制不同颜色通道独立的直方图,我们可以更清晰地观察图像的像素颜色分布情况。