提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
本章我们开始介绍直方图相关知识
1. 什么是直方图
话不多说,直接上公式:
- 公式一(数量的统计):
h ( r k ) = n k k = 0 , 1 , 2 , 3 , . . . L − 1 k 表示灰度图像的像素值 n k 表示图像中像素值为 k ( 或者区间 ) 的像素的个数 \begin{aligned} h(r_k)&=n_k \quad k=0,1,2,3,...L-1 \\ &k\quad表示灰度图像的像素值 \\ &n_k\quad表示图像中像素值为k(或者区间)的像素的个数 \end{aligned} h(rk)=nkk=0,1,2,3,...L−1k表示灰度图像的像素值nk表示图像中像素值为k(或者区间)的像素的个数 - 公式二(概率统计):
p ( r k ) = h ( r k ) M ∗ N = n k M ∗ N M , N 表示灰度图像的行数和列数 n k 表示图像中像素值为 k ( 或者区间 ) 的像素的个数 根据 公式可以得知 p ( r k ) 的总和是 1 \begin{aligned} p(r_k)&=\frac{h(r_k)}{M*N}=\frac{n_k}{M*N} \\ &M,N\quad表示灰度图像的行数和列数 \\ &n_k\quad表示图像中像素值为k(或者区间)的像素的个数 \\ 根据&公式可以得知p(r_k)的总和是1 \end{aligned} p(rk)根据=M∗Nh(rk)=M∗NnkM,N表示灰度图像的行数和列数nk表示图像中像素值为k(或者区间)的像素的个数公式可以得知p(rk)的总和是1
简单一句话就是,直方图是统计像素的,统计某一个灰度级别的像素有多少个,并将统计的结果以图表的方式绘制出来。
2. 直方图绘制
2.1 直方图统计代码
import numpy as np
import matplotlib.pyplot as plt
import cv2 as cv
if __name__ == '__main__':
# 读取灰度图像
imgGray1 = cv.imread('Image/Fig0401.tif', 0)
imgGray2 = cv.imread('Image/Fig0402.tif', 0)
imgGray3 = cv.imread('Image/Fig0403.tif', 0)
imgGray4 = cv.imread('Image/Fig0404.tif', 0)
hist1 = cv.calcHist([imgGray1], [0], None, [256], [0, 256])
hist2 = cv.calcHist([imgGray2], [0], None, [256], [0, 256])
hist3 = cv.calcHist([imgGray3], [0], None, [256], [0, 256])
hist4 = cv.calcHist([imgGray4], [0], None, [256], [0, 256])
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.figure(figsize=(10, 5))
titleList = ["暗图像", "亮图像", "低对比度图像", "高对比度", "直方图", "直方图", "直方图", "直方图"]
imageList = [imgGray1, imgGray2, imgGray3, imgGray4, hist1, hist2, hist3, hist4]
for i in range(4):
plt.subplot(2, 4, i + 1), plt.title(titleList[i]), plt.axis('off')
plt.imshow(imageList[i], vmin=0, vmax=255, cmap='gray')
for i in range(4,8):
plt.subplot(2, 4, i + 1), plt.title(titleList[i])
plt.plot(imageList[i], color='r')
plt.tight_layout()
plt.savefig("Image/tmp.png")
plt.show()
2.2 直方图绘制效果

从上图中可以看出:
较暗的图像直方图集中在灰度级低的区域较亮的图像直方图集中在灰度级高的区域对比度低的图像灰度等级比较集中对比度高的图像灰度等级比较分散

192

被折叠的 条评论
为什么被折叠?



