一、图像直方图
-
图像直方图是反映图像像素分布的统计表,横坐标代表像素值的取值区间,纵坐标代表每一像素值在图像中的像素总数或者所占的百分比。 灰度直方图是图像灰度级的函数,用来描述每个灰度级在图像矩阵中的像素个数。
-
灰度直方图反映了图像中的灰度分布规律,直观地表现了图像中各灰度级的占比,很好地体现出图像的亮度和对比度信息:灰度图分布居中说明亮度正常,偏左说明亮度较暗,偏右表明亮度较高;狭窄陡峭表明对比度降低,宽泛平缓表明对比度较高。
-
根据直方图的形态可以判断图像的质量,通过调控直方图的形态可以改善图像的质量。
二、函数 cv2.calcHist
- Numpy中的函数 np.bincount 也可以实现同样的功能。
cv2.calcHist(images, channels, mask, histSize, ranges[, hist[, accumulate ]]) → hist
参数说明:
- images:输入图像,用 [] 括号表示
- channels: 直方图计算的通道,用 [] 括号表示
- mask:掩模图像,一般置为 None
- histSize:直方柱的数量,一般取 256
- ranges:像素值的取值范围,一般为 [0,256]
- 返回值 hist:返回每一像素值在图像中的像素总数,形状为 (histSize,1)
注意:
- 1.参数 images, channels, histSize, ranges 都要带 [] 号。
- 2.mask 是与 images 大小相同的掩模图像,掩模为 0 的区域不作处理。不使用掩模时设为 None。
- channels 设置对彩色图像的指定通道计算直方图,灰度图像时设为 0。
- Numpy 中的函数 np.bincount 也可以实现同样的功能,但该函数返回值的形状为 (histSize,)
三、例程
- 1.57 图像的灰度直方图
import cv2
import numpy as np
from matplotlib import pyplot as plt
# 1.57 图像的灰度直方图
img = cv2.imread(r"e:/opencv/bgra.png", flags=0) # flags=0 读取为灰度图像
histCV = cv2.calcHist([img], [0], None, [256], [0, 256]) # OpenCV 函数 cv2.calcHist
histNP, bins = np.histogram(img.flatten(), 256)
print(histCV.shape, histNP.shape) # histCV: (256, 1), histNP: (256,)
plt.figure(figsize=(10,3))
plt.subplot(131), plt.imshow(img, cmap='gray', vmin=0, vmax=255), plt.title("Original"), plt.axis('off')
plt.subplot(132,xticks=[], yticks=[]), plt.axis([0,255,0,np.max(histCV)])
plt.bar(range(256), histCV[:,0]), plt.title("Gray Hist(cv2.calcHist)")
plt.subplot(133,xticks=[], yticks=[]), plt.axis([0,255,0,np.max(histCV)])
plt.bar(bins[:-1], histNP), plt.title("Gray Hist(np.histogram)")
plt.show()
四、资料
youcans_的博客:
https://blog.csdn.net/youcans/article/details/121543352














网友评论