OpenCV Python 怎样计算并绘制图像区域的直方图?
图像处理中的直方图是一个重要的概念。通过直方图可以有效地分析图像的像素强度分布情况,从而更好地理解图像。本文将会介绍OpenCV Python库如何计算并绘制图像区域的直方图,并结合实例代码进行详细讲解。
直方图的概念
直方图是将图像的像素强度分成若干个区间,统计每个区间内像素的数量,画出像素数量与强度关系的直方图,用于显示图像强度的分布情况。根据具体的应用场景,可以选择绘制灰度图像的直方图或者彩色图像的某一个通道的直方图。
计算图像直方图
OpenCV库提供了计算图像直方图的API:cv2.calcHist()。该函数计算图像或图像区域的直方图,需要用户指定以下参数:
cv2.calcHist(images, channels, mask, histSize, ranges[, hist[, accumulate]])
- images:图像数据,可以是单张图像,也可以是图像序列;
- channels:要计算直方图的通道,用方括号括起来的数字。例如,对于灰度图像,通道为0,对于彩色图像,r、g、b通道表示为0、1、2;
- mask:图像区域,用于计算图像区域的直方图。如果不需要计算图像区域,可以将其置为 None,以统计整幅图像的直方图;
- histSize:直方图的大小,用于表示每个通道分为多少个部分;
- ranges:像素值范围,一般来说是 0~256。
下面是Python代码示例,采用默认的蓝色通道(因为使用的灰度图像)计算整幅图像的直方图,可以很清晰地看到不同像素值的分布情况:
import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('example.png', 0)
hist = cv2.calcHist([img], [0], None, [256], [0, 256])
plt.hist(img.ravel(), 256, [0, 256])
plt.show()
绘制图像直方图
在计算图像直方图的基础上,OpenCV库还提供了绘制图像直方图的API:cv2.plotHist()。该函数可以用于绘制单通道或多通道、整幅图像或图像区域的直方图。用户需指定以下参数:
retval = cv2.plotHist(hist[, channels[, mask[, color[, thickness[, lineType[, binWidth]]]]]])
- hist:图像的直方图,通常是通过 cv2.calcHist() 计算得出的结果;
- channels:与 cv2.calcHist() 相同,用于指定要绘制的通道,默认为所有通道;
- mask:与 cv2.calcHist() 相同,用于指定要计算的图像区域,默认为整幅图像;
- color:绘制颜色,通常为灰色([128, 128, 128]);
- thickness:绘制线的厚度,默认为1;
- lineType:绘制线的类型,默认为8;
- binWidth:绘制线的宽度,通常为1。
下面是Python代码示例,采用默认的蓝色通道(因为使用的灰度图像)计算整幅图像的直方图,并使用plotHist()函数绘制出来,可以清晰地看到直方图的分布情况:
import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('example.png', 0)
hist = cv2.calcHist([img], [0], None, [256], [0, 256])
plt.plot(hist)
plt.show()
绘制彩色图像指定通道的直方图
在彩色图像中,可以指定绘制某一通道的直方图。对于RGB图像,分别表示红色、绿色、蓝色通道。对于HSV图像,分别表示色相、饱和度、明度(Value)通道。下面是Python代码示例,绘制RGB图像的红色通道直方图:
import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('example.jpg')
color = ('b', 'g', 'r')
for i, col in enumerate(color):
hist = cv2.calcHist([img], [i], None, [256], [0,256])
plt.plot(hist, color=col)
plt.xlim([0, 256])
plt.show()
绘制彩色图像三通道的直方图
对于彩色图像,还可以将三个通道的直方图绘制在同一张图上,同时进行比较。下面是Python代码示例,绘制RGB图像三通道的直方图:
import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('example.jpg')
color = ('b', 'g', 'r')
plt.figure()
plt.title('Color Histogram')
for i, col in enumerate(color):
hist = cv2.calcHist([img], [i], None, [256], [0,256])
plt.plot(hist, color=col)
plt.xlim([0, 256])
plt.show()
结论
本文介绍了OpenCV Python库中如何计算并绘制图像区域的直方图。通过cv2.calcHist()函数计算直方图,通过cv2.plotHist()函数绘制直方图。同时,对于彩色图像,可以选择绘制某一通道或三通道的直方图。直方图可以有效地分析图像的像素强度分布情况,是图像处理中常用的一种方法。