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

19.OpenCV的直方图基础


文章目录

  • 前言
  • 一、用hist()函数绘制直方图
  • 二、用calcHist()函数查找直方图
  • 三、应用掩模的直方图
  • 四、NumPy中的直方图
  • 五、OpenCV-Python资源下载
  • 总结


前言

  直方图是一种重要的图像分析工具,它主要描述图像内部的灰度信息,可直观的反应图像的对比度、亮度、强度分布等特征。
  从统计学角度来看,直方图用于统计图像内各个灰度级出现的次数,直方图的横坐标表示图像的灰度级,纵坐标表示像素灰度级的数量。在使用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()

【OpenCV-Python】19.OpenCV的直方图基础_第1张图片


二、用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()

【OpenCV-Python】19.OpenCV的直方图基础_第2张图片


三、应用掩模的直方图

  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()

  图像的掩模:
【OpenCV-Python】19.OpenCV的直方图基础_第3张图片
  图像掩模的直方图:
【OpenCV-Python】19.OpenCV的直方图基础_第4张图片


四、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】19.OpenCV的直方图基础_第5张图片


五、OpenCV-Python资源下载

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


总结

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

你可能感兴趣的:(OpenCV-Python,opencv,python,计算机视觉)