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()
结果: