OpenCV_直方图处理
一.什么是直方图
灰度直方图是灰度级的函数,描述的是图像中具有该灰度级的像元的个数。确定图像像元的灰度值范围,以适当的灰度间隔为单位将其划分为若干等级,以横轴表示灰度级,以纵轴表示每一灰度级具有的像元数或该像元数占总像元数的比例值,做出的条形统计图即为灰度直方图。
![](https://i-blog.csdnimg.cn/blog_migrate/44eb5d9ca2389f0d3c826381f4b2ce6f.png)
二.绘制直方图
2.1使用numpy绘制直方图
import matplotlib.pyplot
import matplotlib.pyplot as plt
import numpy
import cv2
img = cv2.imread("../photo/test_1.jpg")
matplotlib.pyplot.hist(img.ravel(),256)
plt.hist(img.ravel(),256)
plt.show()
while cv2.waitKey(0) != -1 :
cv2.destroyAllWindows()
break
函数:matplotlib.pyplot.hist(X,BINS)
作用:使用matplotlib.pyplot模块绘制直方图
参数:
X:数据源,必须为一维数据,不可以直接传入图片。
BINS:灰度级分组情况,即分为多少组
函数:img.ravel()
作用:将二维数组降维
参数:无
直方图结果:
![](https://i-blog.csdnimg.cn/blog_migrate/cdf8101387b66b336c82e5fe63004de8.png)
2.2使用opencv绘制直方图
import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread("../photo/test_1.jpg")
hist = cv2.calcHist([img],[0],None,[256],[0,256])
print(hist)
plt.plot(hist)
plt.show()
while cv2.waitKey(0) != -1 :
cv2.destroyAllWindows()
break
函数:hist = cv2.calcHist(images,channels,mask,histSize,ranges,accumluate)
作用:使用opencv绘制直方图
参数:
hist:返回值,为一维数组
imges:图像,传入图像时需要加入括号,[img]
channels:指定通道编号,灰度图时[0],彩色图时[0],[1],[2]
mask:掩模图像
histSize:分为多少组,[256]
accumulate:默认不需要设置
函数:plt.plot(x,y)
作用:绘制直方图
参数:
x:x轴
y:y轴
![](https://i-blog.csdnimg.cn/blog_migrate/d551f864e06937f7e0345f03320ff820.png)
三.直方图均值化
通常使用直方图均值化使图片变得清晰,偏亮的变暗,偏暗的变亮
原理:
通过图片直方图获取不同灰度级在所有灰度级的比例
根据不同灰度级的累计比列与灰度级数相乘得到新灰度级
import cv2
import matplotlib.pyplot as plt
img = cv2.imread("../photo/lena.jpg")
img = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
equ = cv2.equalizeHist(img)
cv2.imshow("img",img)
cv2.imshow("equ",equ)
plt.figure("原始图像直方图")
plt.hist(img.ravel(),256,color="r")
plt.figure("均衡图像直方图")
plt.hist(equ.ravel(),256,color="r")
plt.show()
while cv2.waitKey(0) != -1 :
cv2.destroyAllWindows()
break
函数:dst = cv2.equlizeHist(src)
作用:对图像均值化处理
参数:
dst:所得图像
src:输入图像
![](https://i-blog.csdnimg.cn/blog_migrate/bc51727f357814823ee2bc4b8ffe64f2.png)