思路:先把图片转换为灰度图,然后根据灰度值的分布来绘制直方图
使用方法:matplotlib库,hist函数,revel()函数
hist函数功能:根据数据源和像素级绘制直方图
使用方法:hist(数据源,像素级)
数据源:一维数组。由于灰度图像是由一个二维数组组成,所以需要使用revel()函数进行转换。
像素级:一般是256
ravel()使用方法:一维数组=多维数组.ravel()
具体实践:将彩色图转换为灰度图,并绘制灰度图的直方图,显示灰度图和直方图
#!/usr/bin/env python
# coding=utf-8
import cv2
import matplotlib.pyplot as plt
#读图
img = cv2.imread(r'C:\Users\thorne\PycharmProjects\biyesheji\image\13.jpeg')
#转换成灰度图
img2 = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
#显示灰度图
cv2.imshow('gray_img',img2)
cv2.waitKey(0)
#获取直方图,由于灰度图img2是二维数组,需转换成一维数组
plt.hist(img2.ravel(),256)
#显示直方图
plt.show()
cv2.waitKey(0)
运行结果:
补充知识:图像直方图是表示数字图像中亮度分布的直方图,标绘了图像中每个亮度值的像素个数。 这种直方图中,横坐标的左侧为较暗的区域,而右侧为较亮的区域。因此一张较暗图片的直方图中的数据多集中于左侧和中间部分,而整体明亮、只有少量阴影的图像则相反。
法二:自己写函数计算灰度直方图
import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt
def calcGrayHist(I):
# 计算灰度直方图
h, w = I.shape[:2]
grayHist = np.zeros([256], np.uint64)
for i in range(h):
for j in range(w):
grayHist[I[i][j]] += 1
return grayHist
img = cv.imread(r'C:\Users\thorne\PycharmProjects\biyesheji\image\13.jpeg')
grayHist = calcGrayHist(img)
x = np.arange(256)
# 绘制灰度直方图
plt.plot(x, grayHist, linewidth=2)
plt.xlabel("gray Label")
plt.ylabel("number of pixels")
plt.show()
cv.waitKey()