引言
在图像处理中,掩膜(Mask)是一个非常重要的概念,它允许我们选择性地处理图像的特定区域。今天,我将通过一个实际的例子来展示如何使用OpenCV和Python对手机图像进行掩膜处理并分析其直方图。
1. 准备工作
首先,我们需要导入必要的库:
import cv2
import numpy as np
from matplotlib import pyplot as plt
2. 加载并显示原始图像
我们首先加载一张名为"phone.png"的图像,并将其转换为灰度图:
phone = cv2.imread('phone.png', cv2.IMREAD_GRAYSCALE)
cv2.imshow('phone', phone)
cv2.waitKey(0)
cv2.IMREAD_GRAYSCALE
参数告诉OpenCV以灰度模式加载图像。cv2.imshow()
用于显示图像,cv2.waitKey(0)
则等待用户按键后才继续执行。
- 图像显示如下:
3. 创建掩膜
接下来,我们创建一个与原始图像大小相同的全黑图像作为掩膜基础:
mask = np.zeros(phone.shape[:2], np.uint8) # 创建黑白图像,用于制作mask
mask[50:350, 100:470] = 255
cv2.imshow('mask', mask)
cv2.waitKey(0)
这里,我们在掩膜上定义了一个矩形区域(从y=50到350,x=100到470),并将该区域设置为白色(255),其余部分保持黑色(0)。这个白色矩形就是我们的感兴趣区域(ROI)。
- 图片显示如下:
3. 应用掩膜
使用按位与操作将掩膜应用到原始图像上:
phone_mask = cv2.bitwise_and(phone, phone, mask=mask)
cv2.imshow('phone_mask', phone_mask)
cv2.waitKey(0)
cv2.bitwise_and()
函数执行按位与操作,由于我们使用了相同的图像作为两个输入,实际上就是使用掩膜来选择图像的部分区域。在掩膜为白色的区域,原始图像内容会被保留;在掩膜为黑色的区域,结果图像对应位置会被置为0(黑色)。
- 图片显示如下:
5. 计算并显示直方图
最后,我们计算掩膜区域内图像的直方图:
phone_hist_mask = cv2.calcHist([phone], [0], mask, [256], [0,256])
plt.plot(phone_hist_mask) # 使用calcHist的值绘制曲线图
plt.show()
cv2.calcHist()
函数的参数解释:
[phone]
: 输入图像列表[0]
: 计算直方图的通道索引(灰度图只有0通道)mask
: 使用的掩膜[256]
: 直方图的bin数量[0,256]
: 像素值范围
然后我们使用Matplotlib的plt.plot()
函数绘制直方图曲线,plt.show()
显示图表。
- 直方图显示如下:
6. 结果分析
通过这个过程,我们可以:
- 清晰地看到原始手机图像
- 观察我们定义的掩膜区域
- 查看应用掩膜后的效果(只有ROI区域可见)
- 分析ROI区域的像素值分布(直方图)
直方图可以帮助我们了解图像的对比度、亮度分布等信息,对于后续的图像处理(如阈值分割、对比度增强等)非常有帮助。
7. 总结
通过这个简单的例子,我们学习了如何使用OpenCV进行基本的图像掩膜操作和直方图分析。这些技术是更复杂图像处理任务的基础,掌握它们将为你的计算机视觉之旅打下坚实基础。
希望这篇博客对你有所帮助!如果你有任何问题或建议,欢迎在评论区留言。