思路:先把图片转换为灰度图,然后根据灰度值的分布来绘制直方图

使用方法: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()

 

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐