python-opencv(12)直方图

简介: 文章目录1. 基本概念1.1. 直方图1.2. 归一化直方图1.3. 使用参数

1. 基本概念

1.1. 直方图

  • 横坐标:图像中各个像素点的灰度级。
  • 总坐标:具有该灰度级的像素个数。

1.2. 归一化直方图

  • 横坐标:图像中各个像素点的灰度级。
  • 纵坐标: 出现这个灰度级的概率。

1.3. 使用参数

DIMS,使用参数的数量。

BINS:参数子集的数目

RANGE:统计灰度值的范围,一般为[0,255],最小值:0,黑色,最大值:255,白色。

2. 绘制直方图

2.1. 通过matplotlib绘制

在绘制直方图的时候,我们可以使用matplotlib.pyplot中的函数hist,它的主要的功能就是根据数据源和像素级绘制直方图。

函数:hist(数据源,像素级)

数据源:图像,必须是一维数组

像素级:一般是256,指的是[0,255]

在绘制的过程中,我们需要使用函数ravel()将多维的数组给降维一维数组。

代码实现

#%%绘制直方图
import numpy as np
import matplotlib.pyplot as plt
import cv2
img = cv2.imread(r'C:\\Users\\lihuanyu\\Desktop\\opencv\\image\\boat.jpg')
cv2.imshow("origial",img)
cv2.waitKey()
cv2.destroyWindow()
plt.hist(img.ravel(),256)

结果

2.2. 通过OpenCV绘制直方图

所用函数:

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

hist :直方图

返回的是直方图,是一个二维数组,即每个灰度级的像素个数。

images :原始图像

使用时需要用[ ]括起来。

channels :指定通道


通道编号需要用编号括起来。

输入灰色图像时,它的值为[0]。

彩色图像可以是[0],[1],[2]分别表示的是B,G,R三个通道。

mask :掩码图像


统计整幅图像的直方图,设为None。

统计图像某一部分的直方图时,需要掩码图像。

histSize : BINS的数量


需要用中括号括起来,例如[256]

ranges :像素值范围,例如:[0,255]

accumulate :累计标识,可选参数


默认值为false。

如果被设置为true,则直方图在开始分配时不会被清零。

该参数允许从多个对象中计算单个直方图,或者用于实时更新直方图。

多个直方图的累积结果,用于对一组图像计算直方图。

代码实现:

#%%通过opencv绘制直方图
import numpy as np
import matplotlib.pyplot as plt
import cv2
img = cv2.imread(r'C:\\Users\\lihuanyu\\Desktop\\opencv\\image\\girl.bmp')
cv2.imshow("origial",img)
hist_b = cv2.calcHist([img],[0],None,[256],[0,255])
hist_g = cv2.calcHist([img],[1],None,[256],[0,255])
hist_r = cv2.calcHist([img],[2],None,[256],[0,255])
plt.plot(hist_b,color = "b")
plt.plot(hist_g,color = "g")
plt.plot(hist_r,color = "r")
plt.show()
cv2.waitKey()
cv2.destroyWindow()

结果:

3. 使用掩模的直方图

由图片加深我们的理解代码实现

#%%使用掩模的直方图
import numpy as np
import cv2
import matplotlib.pyplot as plt
img = cv2.imread(r'C:\\Users\\lihuanyu\\Desktop\\opencv\\image\\girl.bmp',0)
#生成掩模
mask = np.zeros_like(img,dtype=np.uint8)
mask[200:400,200:400] = 255
hist_mask = cv2.calcHist([img],[0],mask,[256],[0,255])
hist = cv2.calcHist([img],[0],None,[256],[0,255])
plt.plot(hist_mask)
plt.plot(hist)
plt.show()

结果:

4. 直方图均衡化

直方图均衡化是将原图像通过某种变换,得到一幅灰度直方图为均匀分布的新图像的方法。

直方图均衡化方法的基本思想是对在图像中像素个数多的灰度级进行展宽,而对像素个数少的灰度级进行缩减。从而达到清晰图像的目的。

4.1. 直方图均衡化函数

函数:dst = cv2.equalizeHist( src )

src:源图像,必须是8位位图。

dst:目标图像,处理结果。

代码实现:

#%%直方图均衡化
import numpy as np
import matplotlib.pyplot as plt
import cv2
img = cv2.imread(r'C:\\Users\\lihuanyu\\Desktop\\opencv\\image\\equ.bmp',cv2.IMREAD_GRAYSCALE)
img1 = cv2.equalizeHist(img)
fig,ax = plt.subplots(2,2,figsize=(10,10))
ax1 = plt.subplot(221)  #绘制子图1对象
ax2 = plt.subplot(222)  #绘制子图2对象
ax3 = plt.subplot(223)  #绘制子图3对象
ax4 = plt.subplot(224)  #绘制子图4对象
ax1.imshow(img,cmap=plt.cm.gray)
ax1.set_title('original image')
ax1.axis("off")
ax2.set_title('equalizing image')
ax2.imshow(img1,cmap=plt.cm.gray)
ax2.axis("off")
ax3.set_title('original image histogram')
ax3.hist(img.ravel(),256)
ax4.set_title('equalizing image histogram')
ax4.hist(img1.ravel(),256)
plt.show()

结果:

相关文章
OpenCV-绘制简易直方图DrawHistImg
OpenCV-绘制简易直方图DrawHistImg
|
数据可视化 Python
【100天精通Python】Day62:Python可视化_Matplotlib绘图基础,绘制折线图、散点图、柱状图、直方图和饼图,以及自定义图标外观和功能,示例+代码
【100天精通Python】Day62:Python可视化_Matplotlib绘图基础,绘制折线图、散点图、柱状图、直方图和饼图,以及自定义图标外观和功能,示例+代码
223 0
|
6月前
|
计算机视觉
OpenCV中的二维直方图
【6月更文挑战第12天】中的二维直方图。
24 1
|
6月前
|
算法 计算机视觉
【Qt&OpenCV 直方图计算 split/calcHist/normalize】
【Qt&OpenCV 直方图计算 split/calcHist/normalize】
52 0
|
6月前
|
Python
Python学习笔记之Matplotlib模块入门(直线图、折线图、曲线图、散点图、柱状图、饼状图、直方图、等高线图和三维图的绘制)-2
Python学习笔记之Matplotlib模块入门(直线图、折线图、曲线图、散点图、柱状图、饼状图、直方图、等高线图和三维图的绘制)
|
6月前
|
数据可视化 开发者 Python
Python学习笔记之Matplotlib模块入门(直线图、折线图、曲线图、散点图、柱状图、饼状图、直方图、等高线图和三维图的绘制)-1
Python学习笔记之Matplotlib模块入门(直线图、折线图、曲线图、散点图、柱状图、饼状图、直方图、等高线图和三维图的绘制)
|
7月前
|
计算机视觉 索引
【OpenCV】- 直方图反向投影
【OpenCV】- 直方图反向投影
|
7月前
|
计算机视觉 索引
【OpenCV】直方图计算 & 均衡化直方图
【OpenCV】直方图计算 & 均衡化直方图
|
7月前
|
存储 计算机视觉 Python
【python版CV】-直方图 & 傅里叶变换
【python版CV】-直方图 & 傅里叶变换
|
7月前
|
算法 计算机视觉
OpenCV直方图
OpenCV直方图
40 0