news 2026/6/10 16:55:04

计算机视觉——Opencv(图像直方图与掩膜)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
计算机视觉——Opencv(图像直方图与掩膜)

图像直方图

直方图:

是图像中像素强度分布的图形表达方式。

直方图的作用:

例如视频中,通过标记帧和帧之间显著的边缘和颜色的统计变化,来检测视频中场景的变换。

灰度值在0 - 255范围之间总共 256 个值,可以将我们的范围划分为子部分(称为bins)

Matplotlib 直接绘制灰度直方图

import cv2 import matplotlib.pyplot as plt phone = cv2.imread(r"C:\Users\LEGION\Desktop\OIP-C.webp",cv2.IMREAD_GRAYSCALE)#将图像转换为一维数组 a = phone.ravel() #这里使用了numpy的ravel函数,将多维数组拉成一维数组。 #绘制直方图 plt.hist(a,bins=256) #使用matplotlib 的hist函数绘制直方图。# 参数解释: #-a:一维数组,即图像的像素值组成的数组。 #-bins=256:指定直方图的条数,即灰度级的数量。 plt.show()

数组拉平:

ravel()函数作用是将多维数组转换为一维数组,例如一张大小为 400×500 的灰度图,经过ravel()处理后,会变成一个长度为 200000 的一维数组,数组中的每个元素对应图像的一个像素值,这是 Matplotlibhist函数的输入要求。

plt.hist()函数的两个核心参数分别是a(待统计的一维数组)和bins=256(指定直方图的区间数量,对应灰度图像的 256 个灰度级)。运行代码后,我们会得到一张从 0 到 255 的直方图,横坐标是像素的灰度值,纵坐标是对应灰度值在图像中出现的次数

运行结果:

使用calcHist函数绘制灰度直方图

import cv2 import matplotlib.pyplot as plt phone_hist = cv2.calcHist( [phone], [0], None, [16], [0,256]) plt.plot(phone_hist)#使用calcHist的值绘制曲线图 plt.show()

参数解析:

[phone]:输入图像,必须以列表形式传入

[0]:通道索引,同样是要以列表的形式传入,灰度图像只有一个通道,索引为0。如果是彩色图像,我们会在后续分别传入[0][1][2]对应蓝、绿、红三个通道。

None:掩膜图像,此处为None,表示计算整个图像的直方图

[16]:直方图的区间数量(bins),此处将256个灰度级合并为16个区间

[0, 256]:像素值的取值范围,这是一个左闭右开区间。

运行结果:

彩色图像直方图绘制

import cv2 import matplotlib.pyplot as plt img=cv2.imread(r"C:\Users\LEGION\Desktop\OIP-C.webp") 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.show()

彩色图像的通道顺序:默认返回的是 BGR 格式的图像

enumerate()函数会同时返回通道索引i和对应的颜色col,通道索引i传入calcHist函数的第二个参数,用于指定当前计算的通道;

运行结果:

掩膜

在实际的项目中,我们往往不需要计算整个图像的直方图,而是只需要计算图像中某个特定区域的直方图,这时候就需要用到掩膜(Mask)技术。

掩膜本质上是一张与原始图像大小相同的灰度图像,其中白色区域(像素值 255)表示需要计算的区域,黑色区域(像素值 0)表示不需要计算的区域,通过cv2.bitwise_and()函数与原始图像进行按位与操作,即可提取出我们需要的区域,再计算该区域的直方图。

制作掩膜并提取目标区域

import cv2 import matplotlib.pyplot as plt #cv2.bitwise_and():对图像(灰度图像或彩色图像均可)每个像素值进行二进制"与"操作,1&1=1,1&0=0,01=0,0&0=0# # bitwise_and(src1, src2, dst=None, mask=None)参数: #src1、Src2:为输入图像或标量,标src1和src2相与。 #dst:可选输出变量,如果需要使用非None则要先定义,且其大小与输入变量相同 #mask:图像掩膜,可选参数,用于指定要更改的输出图像数组的元素,mask为o的值,src1和Isrc2相与的值都为o. phone = cv2.imread(r"C:\Users\LEGION\Desktop\OIP-C.webp",cv2.IMREAD_GRAYSCALE) cv2.imshow('phone',phone) cv2.waitKey(0) #创建掩膜图像:初始化一张全黑图像(像素值0) mask = np.zeros(phone.shape[:2],np.uint8)#创建黑白图像,用于制作maskmask[50:350,100:470] = 255 cv2.imshow( 'mask',mask) cv2.waitKey(0) Phone_mask = cv2.bitwise_and(phone,phone,mask=mask) cv2.imshow( 'phone_mask', Phone_mask) cv2.waitKey(0)

按位与操作:

cv2.bitwise_and()函数接收三个核心参数,前两个参数是需要进行按位与操作的图像(此处均为原始灰度图像),第三个参数是掩膜图像。

按位与操作的逻辑是:

对于每个像素点,只有当掩膜图像的对应像素值为 255(二进制全 1)时,原始图像的像素值才会保留;当掩膜图像的对应像素值为 0(二进制全 0)时,结果图像的对应像素值也会变为 0,从而实现目标区域的提取。

运行结果:

计算并绘制局部区域直方图

phone_hist_mask = cv2.calcHist([phone], [0],mask, [256],[0,256]) plt.plot(phone_hist_mask)#使用calcHist的值绘制曲线图 plt.show()

与计算整个图像的直方图相比,这段代码的唯一区别就是将calcHist函数的第三个参数从None改为了我们制作的掩膜图像mask,这样函数就只会计算掩膜中白色区域对应的像素值分布,从而得到局部区域的直方图。

运行结果:

通过掩膜技术,我们可以精准地分析图像中任意感兴趣区域(ROI)的像素分布特征,这在目标检测、图像分割、缺陷检测等实际项目中有着广泛的应用。例如,在人脸识别项目中,我们可以使用掩膜提取人脸区域,只计算人脸区域的直方图,从而避免背景区域的干扰,提高后续处理的精度。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 10:33:45

告别学术入门恐慌:paperzz 开题报告搭建硕士科研的智能脚手架

Paperzz-AI官网免费论文查重复率AIGC检测/开题报告/文献综述/论文初稿 paperzz - 开题报告https://www.paperzz.cc/proposalhttps://www.paperzz.cc/proposal 凌晨两点,某高校社会学硕士小杨的电脑屏幕还亮着 —— 开题报告的文档里,标题改了第五版&…

作者头像 李华
网站建设 2026/6/10 12:02:06

低成本快速启动!一站式同城跑腿小程序平台源码系统

温馨提示:文末有资源获取方式对于有志于进入本地生活服务领域的创业者或团队而言,如何以最小技术投入快速验证市场、搭建业务平台是一大挑战。本文将为您拆解一款高度集成、开箱即用的一站式同城跑腿源码系统,帮助您清晰了解其如何助力业务迅…

作者头像 李华
网站建设 2026/6/10 11:59:25

研究生收藏!千笔ai写作,最受喜爱的AI论文平台

你是否曾为论文选题发愁,反复修改却总对表达不满意?是否在深夜面对空白文档无从下笔,又担心查重率过高?论文写作的种种难题,让无数学生陷入焦虑。而如今,一款专为学术写作打造的智能工具——千笔AI&#xf…

作者头像 李华
网站建设 2026/6/10 11:41:28

环岛路骑行 + 黄厝看日出,厦门旅行的正确打开方式

在厦门岛东南海岸,环岛南路蜿蜒而过,串联起一处被誉为“厦门最美海岸线”的自然景观——黄厝沙滩。这片全长约4.2公里的天然海滩,以开阔的海岸线、细腻的沙质和优质的生态环境,成为厦门海滨景观带中保存较为完好的区域之一&#x…

作者头像 李华
网站建设 2026/6/10 11:39:09

深入解析云原生AI应用全栈架构:从Kubernetes智能调度与Istio服务网格到Knative事件驱动与Prometheus可观测性实战指南

深入解析云原生AI应用全栈架构:从Kubernetes智能调度与Istio服务网格到Knative事件驱动与Prometheus可观测性实战指南 在云原生与人工智能深度融合的当下,AI应用(尤其是大模型与推理服务)的部署已不再是简单的“容器化端口暴露”…

作者头像 李华
网站建设 2026/6/10 15:10:16

如何制作高质量的视频二维码以提升分享效果?

在现代交流中,视频二维码以其直观和便捷的特性而备受关注。制作高质量视频二维码的第一步是明确您的需求,选择一个合适的视频文件上传至二维码生成平台。生成后,您可以美化二维码,确保它引人注目。设置有效期和访问权限也很重要&a…

作者头像 李华