【OpenCV-Python】19.OpenCV的直方图基础

19.OpenCV的直方图基础



前言

  直方图是一种重要的图像分析工具,它主要描述图像内部的灰度信息,可直观的反应图像的对比度、亮度、强度分布等特征。
  从统计学角度来看,直方图用于统计图像内各个灰度级出现的次数,直方图的横坐标表示图像的灰度级,纵坐标表示像素灰度级的数量。在使用OpenCv处理直方图时,应注意以下三个概念:
(1) RANGE:要统计的灰度级范围。直方图中像素的灰度级范围一般为[0, 255],0表示黑色,255表示白色。
(2) BINS:灰度级的分组数量。在处理直方图时,将灰度级按一定范围进行划分得到的子集数量为BINS。例如,灰度图像的灰度级范围为[0, 255],按16个灰度级分为一组,可分成16个子集,则BINS为16。
(3) DIMS:绘制直方图时采集的参数数量。一般的直方图只采集灰度级,所以DIMS为1。


一、用hist()函数绘制直方图

  matplotlib.pyplot.hist()函数可根据图像绘制直方图,其基本格式如下:

img = matplotlib.pyplot.hist(src, bins)

src为用于绘制直方图的图像数据, 必须是一维数组, 通常, OpenCV中的BGR图像是三维数组, 可用ravel()函数将其转换为一维数组
bins为灰度级分组数量
import cv2
import numpy as np
import matplotlib.pyplot as plt

img = plt.imread('gate.jpg')

plt.figure(figsize = (25,10))
plt.subplot(1, 2, 1)
plt.axis('off')
plt.title('original')
plt.imshow(img)

plt.subplot(1, 2, 2)
plt.hist(img.ravel(), 256)
plt.title('hist')
plt.show()

在这里插入图片描述


二、用calcHist()函数查找直方图

  可使用OpenCV的cv2.calcHist()函数查找直方图,再利用matplotlib.pyplot的plot()函数绘制直方图。
  cv2.calcHist()函数的基本格式如下:

hist =cv2.calcHist(image, channels, mask, histSize, ranges)

hist为返回的直方图, 是一个一维数组, 其大小为256, 保存了原图像中各个灰度级的数量
image为原图像, 实际参数需要用方括号括起来
channels为通道编号, 灰度图像的通道编号为[0], BGR图像通道的编号为[0][1][2]
mask为掩模图像,None时统计整个图像, 否则统计部分图像
histSize为BINS值, 实际参数需要用方括号括起来,[256]
ranges为像素值范围, 8位灰度图像为[0,256]
img = cv2.imread('gate.jpg')
cv2.imshow('oribinal', img)

histb = cv2.calcHist([img], [0], None, [256], [0, 255])
histg = cv2.calcHist([img], [1], None, [256], [0, 255])
histr = cv2.calcHist([img], [2], None, [256], [0, 255])

plt.plot(histb, color='b')
plt.plot(histg, color='g')
plt.plot(histr, color='r')
plt.show()

cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述


三、应用掩模的直方图

  cv2.calcHist()函数的mask参数用于指定掩模图像。掩模图像为黑底,其中的白色区域可视为透明区域,将其覆盖到原图像上,原图像中可显示出来的部分为掩模结果图像。指定掩模图像时,cv2.calcHist()函数只计算掩模结果图像的直方图。

img = cv2.imread('gate.jpg')  
cv2.imshow('original', img)  

h, w, c = img.shape
mask = np.zeros((h, w), np.uint8)      #按原图大小创建一幅黑色图像

w1 = np.int0(w / 4)
w2 = np.int0(w * 0.75)
h1 = np.int0(h / 4)
h2 = np.int0(h * 0.75)
mask[h1 : h2, w1 : w2] = 255           #设置掩模白色区域
cv2.imshow('mask', mask)               #显示掩模图像

histb=cv2.calcHist([img],[0],mask,[256],[0,255])   #计算B通道直方图
histg=cv2.calcHist([img],[1],mask,[256],[0,255])   #计算G通道直方图
histr=cv2.calcHist([img],[2],mask,[256],[0,255])   #计算R通道直方图

plt.plot(histb,color='b')               #绘制B通道直方图,蓝色
plt.plot(histg,color='g')               #绘制G通道直方图,绿色
plt.plot(histr,color='r')               #绘制R通道直方图,红色
plt.show()                              #显示直方图

cv2.waitKey(0)
cv2.destroyAllWindows()

  图像的掩模:
在这里插入图片描述
  图像掩模的直方图:
在这里插入图片描述


四、NumPy中的直方图

  NumPy的histogram()函数可以用于计算直方图,其基本格式如下:

hist, bin_edges = np.histogram(src, bins, range)

hist为返回的直方图
bin_edges为返回的灰度级分组数量边界值
src为原图转换成的一维数组
bins为灰度级分组数量
range为像素值范围
img = cv2.imread('gate.jpg')
cv2.imshow('original', img)

histb, e1 = np.histogram(img[0].ravel(), 256,[0, 255])
histg, e2 = np.histogram(img[1].ravel(), 256,[0, 255])
histr, e3 = np.histogram(img[2].ravel(), 256,[0, 255])

plt.plot(histb,color='b')               #绘制B通道直方图,蓝色
plt.plot(histg,color='g')               #绘制G通道直方图,绿色
plt.plot(histr,color='r')               #绘制R通道直方图,红色
plt.show()

cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述


五、OpenCV-Python资源下载

OpenCV-Python测试用图片、中文官方文档、opencv-4.5.4源码


总结

  以上内容介绍了OpenCV-Python的直方图基础操作,有关Python、数据科学、人工智能等文章后续会不定期发布,请大家多多关注,一键三连哟(●’◡’●)。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

机器视觉小学徒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值