核心内容摘要
基于深度学习的道路垃圾检测系统(YOLOv8+YOLO数据集+UI界面+Python项目+模型)
图像直方图直方图是图像中像素强度分布的图形表达方式。
直方图的作用例如视频中通过标记帧和帧之间显著的边缘和颜色的统计变化来检测视频中场景的变换。
灰度值在0 - 255范围之间总共 256 个值可以将我们的范围划分为子部分称为binsMatplotlib 直接绘制灰度直方图import cv2 import matplotlib.pyplot as plt phone cv
imread(rC:\Users\LEGION\Desktop\OIP-C.webp,cv
IMREAD_GRAYSCALE)#将图像转换为一维数组 a phone.ravel() #这里使用了numpy的ravel函数将多维数组拉成一维数组。
#绘制直方图 plt.hist(a,bins
#使用matplotlib 的hist函数绘制直方图。
# 参数解释: #-a:一维数组即图像的像素值组成的数组。
#-bins256:指定直方图的条数即灰度级的数量。
plt.show()数组拉平ravel()函数作用是将多维数组转换为一维数组例如一张大小为 400×500 的灰度图经过ravel()处理后会变成一个长度为 200000 的一维数组数组中的每个元素对应图像的一个像素值这是 Matplotlibhist函数的输入要求。
plt.hist()函数的两个核心参数分别是a待统计的一维数组和bins256指定直方图的区间数量对应灰度图像的 256 个灰度级。
运行代码后我们会得到一张从 0 到 255 的直方图横坐标是像素的灰度值纵坐标是对应灰度值在图像中出现的次数运行结果使用calcHist函数绘制灰度直方图import cv2 import matplotlib.pyplot as plt phone_hist cv
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 imgcv
imread(rC:\Users\LEGION\Desktop\OIP-C.webp) color(b,g,r) #循环遍历每个通道计算并绘制直方图 for i,col in enumerate(color): histrcv
calcHist( [img], [i], None, [256],[0,256]) plt.plot( histr,colorcol) plt.show()彩色图像的通道顺序默认返回的是 BGR 格式的图像enumerate()函数会同时返回通道索引i和对应的颜色col通道索引i传入calcHist函数的第二个参数用于指定当前计算的通道运行结果掩膜在实际的项目中我们往往不需要计算整个图像的直方图而是只需要计算图像中某个特定区域的直方图这时候就需要用到掩膜Mask技术。
掩膜本质上是一张与原始图像大小相同的灰度图像其中白色区域像素值 255表示需要计算的区域黑色区域像素值 0表示不需要计算的区域通过cv
bitwise_and()函数与原始图像进行按位与操作即可提取出我们需要的区域再计算该区域的直方图。
制作掩膜并提取目标区域import cv2 import matplotlib.pyplot as plt #cv
bitwise_and():对图像(灰度图像或彩色图像均可)每个像素值进行二进制与操作111100010000# # bitwise_and(src1, src2, dstNone, maskNone)参数: #src
Src2:为输入图像或标量标src1和src2相与。
#dst:可选输出变量如果需要使用非None则要先定义且其大小与输入变量相同 #mask:图像掩膜可选参数用于指定要更改的输出图像数组的元素mask为o的值src1和Isrc2相与的值都为o. phone cv
imread(rC:\Users\LEGION\Desktop\OIP-C.webp,cv
IMREAD_GRAYSCALE) cv
imshow(phone,phone) cv
waitKey(
#创建掩膜图像初始化一张全黑图像像素值0 mask np.zeros(phone.shape[:2],np.uint
#创建黑白图像用于制作maskmask[50:350,100:470] 255 cv
imshow( mask,mask) cv
waitKey(
Phone_mask cv
bitwise_and(phone,phone,maskmask) cv
imshow( phone_mask, Phone_mask) cv
waitKey(
按位与操作cv
bitwise_and()函数接收三个核心参数前两个参数是需要进行按位与操作的图像此处均为原始灰度图像第三个参数是掩膜图像。
按位与操作的逻辑是对于每个像素点只有当掩膜图像的对应像素值为 255二进制全 1时原始图像的像素值才会保留当掩膜图像的对应像素值为 0二进制全 0时结果图像的对应像素值也会变为 0从而实现目标区域的提取。
运行结果计算并绘制局部区域直方图phone_hist_mask cv
calcHist([phone], [0],mask, [256],[0,256]) plt.plot(phone_hist_mask)#使用calcHist的值绘制曲线图 plt.show()与计算整个图像的直方图相比这段代码的唯一区别就是将calcHist函数的第三个参数从None改为了我们制作的掩膜图像mask这样函数就只会计算掩膜中白色区域对应的像素值分布从而得到局部区域的直方图。
运行结果通过掩膜技术我们可以精准地分析图像中任意感兴趣区域ROI的像素分布特征这在目标检测、图像分割、缺陷检测等实际项目中有着广泛的应用。
例如在人脸识别项目中我们可以使用掩膜提取人脸区域只计算人脸区域的直方图从而避免背景区域的干扰提高后续处理的精度。