19.OpenCV的直方图基础
直方图是一种重要的图像分析工具,它主要描述图像内部的灰度信息,可直观的反应图像的对比度、亮度、强度分布等特征。
从统计学角度来看,直方图用于统计图像内各个灰度级出现的次数,直方图的横坐标表示图像的灰度级,纵坐标表示像素灰度级的数量。在使用OpenCv处理直方图时,应注意以下三个概念:
(1) RANGE:要统计的灰度级范围。直方图中像素的灰度级范围一般为[0, 255],0表示黑色,255表示白色。
(2) BINS:灰度级的分组数量。在处理直方图时,将灰度级按一定范围进行划分得到的子集数量为BINS。例如,灰度图像的灰度级范围为[0, 255],按16个灰度级分为一组,可分成16个子集,则BINS为16。
(3) DIMS:绘制直方图时采集的参数数量。一般的直方图只采集灰度级,所以DIMS为1。
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的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的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-4.5.4源码
以上内容介绍了OpenCV-Python的直方图基础操作,有关Python、数据科学、人工智能等文章后续会不定期发布,请大家多多关注,一键三连哟(●’◡’●)。