从统计的角度讲,直方图是图像内灰度值的统计特性与图像灰度值之间的函数,直方图统计图像内各个灰度级出现的次数。从直方图的图像上观察,横坐标是图像中各像素点的灰度级,纵坐标是具有该灰度级(像素值)的像素个数。
直方图是数值数据分布的精确图形表示。 这是一个连续变量(定量变量)的概率分布的估计,并且被卡尔·皮尔逊(Karl Pearson)首先引入。它是一种条形图。
构建直方图:
①将值的范围分段
②计算每个间隔中有多少值
作用
(1)显示图像质量波动的状态
(2)较直观地传递有关过程图像质量状况的信息
(3)掌握过程的状况,从而确定在什么地方集中力量进行图像质量改进工作
直方图绘制
import cv2
import matplotlib.pyplot as plt
img1=cv2.imread(“hj.jpg”,0)
cv2.imshow(“img1”,img1)
plt.hist(img1.ravel(),256,facecolor=‘yellowgreen’)
cv2.waitKey()
cv2.destroyAllWindows()
import cv2
import matplotlib.pyplot as plt
img1=cv2.imread(“bd.jpg”)
cv2.imshow(“img1”,img1)
plt.hist(img1.ravel(),256)
cv2.waitKey()
cv2.destroyAllWindows()
更多参数参考:https://blog.csdn.net/xc_zhou/article/details/82224865
hist()
calcHist()
import cv2
import numpy as np
img=cv2.imread(“bd.jpg”)
hist = cv2.calcHist([img],[0],None,[256],[0,255])
plt.plot(hist,color=‘b’)
绘制彩色的直方图
import cv2
import numpy as np
img=cv2.imread(“bd.jpg”)
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’)
彩色直方图封装
使用掩膜进行直方图绘制
如果一幅图像拥有全部可能的灰度级,并且像素值的灰度均匀分布,那么这幅图像就具有高对比度和多变的灰度色调,灰度级丰富且覆盖范围较大。
直方图均衡化的主要目的是将原始图像的灰度级均匀地映射到整个灰度级范围内,得到一个灰度级分布均匀的图像。
cv2.equalizeHist(src)
src是8位单通道原始图像
对输入的两张图像进行直方图均衡化及直方图计算步骤后,可以对两个图像的直方图进行对比,并通过对比的结果得到一些我们想要的结论。
应用:(1)图像相似度比较
(2)分析图像之间关系
(1)相关性比较(Correlation)
(2)Chi-Square(卡方比较)
(3)Intersection(十字交叉性)
(4)Bhattacharyya distance(巴氏距离)
Step1: 先用cvtColor()把图像从RGB色彩空间转换到HSV色彩空间;
Step2: 计算图像的直方图,然后归一化到[0~1]之间,用到函数 calcHist() 和
normalize()
Step3:使用上述的四种方法之一进行比较,用到函数compareHist()。
Correlation ( CV_COMP_CORREL )
Chi-Square ( CV_COMP_CHISQR )
Intersection ( CV_COMP_INTERSECT )
Bhattacharyya ( CV_COMP_BHATTACHARYYA )
对于任何一张图像,它的直方图中如果存在较为明显的双峰,用直方图分割技术法可以达到很好的效果,否则,达到的效果会很不理想。
一副含有一个背景呈现明显对比的物体的图像具有包含双峰的直方图,如下图所示: