10 图像的基础分析:直方图与掩模操作
图像分析是计算机视觉中的核心,它能够帮助我们理解图像内容和特性。其中,直方图和掩模操作是图像分析中两个非常基本且功能强大的工具。本节课程将详细介绍它们的概念、应用及如何在OpenCV中实现。
直方图
直方图是表示图像中像素强度分布的图表,它统计了每个强度值的像素数。直方图对于理解图像的对比度、亮度和强度分布非常有用。
直方图计算与绘制
OpenCV提供了cv2.calcHist
函数来计算直方图。让我们看一个例子,来计算并显示一幅图像的直方图。
import cv2
from matplotlib import pyplot as plt
# 读取图像
image = cv2.imread('example.jpg', cv2.IMREAD_GRAYSCALE)
# 计算直方图
histogram = cv2.calcHist([image], [0], None, [256], [0, 256])
# 使用matplotlib绘制直方图
plt.plot(histogram)
plt.show()
在这个例子中,cv2.calcHist
函数的参数说明如下:
第一个参数是图像的列表,这里只分析一幅图像。 第二个参数是通道的索引,在灰度图像中为[0],如果是彩色图像,可以传入[0], [1] 或 [2] 来分别计算B、G、R通道的直方图。 第三个参数是掩模图像,用于计算部分图像的直方图。 第四个参数是BIN的数目,即直方图的段数。 第五个参数是像素值的范围。
掩模操作
掩模(Mask)操作允许我们专注于图像的特定部分,基本思想是使用一个二进制图像(掩模)来指定要处理的图像区域。在掩模图像中,像素值为1(或255)的位置指示相应的源图像像素将被处理,而值为0的位置的像素则不会被处理。
掩模操作示例
下面的代码展示了如何使用掩模来专注于图像的一个特定区域。
import cv2
import numpy as np
# 读取图像
image = cv2.imread('example.jpg', cv2.IMREAD_COLOR)
# 创建掩模,大小与图像相同,初始时全部为0(黑色)
mask = np.zeros(image.shape[:2], dtype="uint8")
# 定义感兴趣的区域,例如,在图像中央创建一个白色的正方形区域
cv2.rectangle(mask, (image.shape[1]//4, image.shape[0]//4),
((image.shape[1]*3)//4, (image.shape[0]*3)//4), 255, -1)
# 应用掩模
masked_image = cv2.bitwise_and(image, image, mask=mask)
# 显示结果
cv2.imshow('Masked Image', masked_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
在这个示例中,我们使用cv2.bitwise_and
函数应用掩模。第一个参数是源图像,第二个参数是要应用的掩模。结果是只有中央的白色正方形区域被显示。
直方图与掩模结合使用
现在让我们结合使用直方图和掩模来进行图像分析。我们将计算仅在感兴趣区域的直方图。
# 已经从前面获得了masked_image和mask
# 使用掩模计算直方图
hist_mask = cv2.calcHist([image], [0], mask, [256], [0, 256])
# 使用matplotlib绘制直方图
plt.plot(hist_mask)
plt.title('Histogram for masked area')
plt.show()
当我们仅针对感兴趣区域计算直方图时,可以发现直方图显示了这个区域的像素强度分布情况,这对于进一步的图像分析非常有用,例如在图像中寻找特定对象时考虑它们的颜色特性。
结论
在这节课程中,我们已经学会了如何计算和分析图像的直方图,以及如何执行掩模操作来关注图像中的感兴趣区域。这两种技术是图像处理和计算机视觉的基石,它们为更复杂的图像分析方法提供了基础。掌握这些技巧将有助于你在后续的课程中学习更高级的图像处理技术,如图像分割、特征检测、以及对象识别。
这里简单介绍了一些基本知识点,更细致的内容请参考:
李立宗,OpenCV轻松入门(第2版),电子工业出版社,2023 李立宗,计算机视觉40例(从入门到深度学习:OpenCV-Python),电子工业出版社,2022
单击【阅读原文】参加OpenCV-Python课程学习。
单击【阅读原文】参加OpenCV-Python课程学习。
在本公众号【计算机视觉之光】回复关键字“叮叮当当”获取更多的Python学习资料。