© Fu Xianjun. All Rights Reserved
一、直方图的含义
从统计的角度讲,直方图是图像内灰度值的统计特性与图像灰度值之间的函数,直方图统计图像内各个灰度级的次数。从直方图的图形上观察,横坐标是图像中各像素点的灰度级,纵坐标是具有该灰度级(像素值)的像素个数.
二、绘制直方图
Python的模块matplotlib.pyplot中的hist()函数能够方便地绘制直方图,我们通常采用该函数直接绘制直方图。除次之外,OpenCV中的cv2.calcHist()函数能够计算统计直方图,还可以在此基础上绘制图像的直方图。
1.使用Numpy绘制直方图
语法格式: matplotlib.pyplot.hist(X,BINS)
·X: 数据源,必须是一维的。图像通常是二维的,需要使用ravel()函数(b = a.ravel)将图像处理为一维数据源以后,再作为参数使用。
·BINS: BINS的具体值,表示灰度级的分组情况。
代码如下:
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()
2.使用OpenCV绘制直方图
2.1使用cv2.calcHist()函数统计图像直方图
语法格式:
hist = cv2.calcHist(image,channels,mask,histSize,ranges,accumulate)
·image: 原始图像,该图像需要使用“ [ ] ”括起来。
·channels: 指定通道编号。通道编号需要用“ [ ] ”括起来,如果输入图像是单通道灰度图像,该参数的值就是[0]。对于彩色图像,它的值可以是[0]、[1]、[2],分别对应通道B、G、R。
·mask: 掩码图像,当统计整幅图像的直方图时,将这个值设置为None。当统计图像某一部分的直方图时,需要用到掩码图像。
·histSize: BINS的值,该值需要用“ [ ] ”括起来。
·ranges: 即像素范围。
·accumulate: 累积标识,默认值为False。
代码如下:
import cv2
import numpy as np
import matplotlib.pyplot as plt
img=cv2.imread("bd.jpg")
hist = cv2.calcHist([img],[0],None,[256],[0,255])
plt.plot(hist,color='b')
2.2绘制彩色直方图
代码如下:
import cv2
import numpy as np
import matplotlib.pyplot as plt
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')
2.3彩色直方图封装
代码如下:
import cv2
import numpy as np
from matplotlib import pyplot as plt
def image_hist(image):
color = ('blue', 'green', 'red')
for i, color in enumerate(color):
hist = cv2.calcHist([image], [i], None, [256], [0, 256])
plt.plot(hist, color=color)
plt.xlim([0, 256])
plt.show()
img=cv2.imread