直方图 Histogram
每张图像都对应有直方图,再Ps软件、单反都可以轻易地看到图像的直方图,直方图则可以看出图像得风格。
图像的直方图代表了不同灰度级的像素出现的次数。
首先看一下灰度级是什么意思?

这张图就清晰的展示了灰度级的概念,通俗来说就是明亮的程度。
然后看一下直方图长什么样子?

这里面对三个颜色通道都画了出来,横坐标代表灰度级,纵坐标代表数量,数量越多图像就越高。
如何理解直方图?
如图,再PS的Camera滤镜中把灰度级做了一个区分,它把直方图分成了五类,从左到右分别是:黑色、阴影、曝光、高光、白色,鼠标悬浮即会高亮一片区域并且显示该区域代表图像的什么部分。所以就很容易理解直方图了,调整图像的高光等都会使得直方图放生改变。
这里有一个误区是不能把从左到右直方图对应到图像从左到右。因为图像的阴影、高光区域位置都很不规则。如果图像真的从左到右与直方图对应,那么就变成了第一张图这种形式了。
代码实现
# ------------------------------------------------------------------------------
# # @Time : 2020/3/22 上午 11:33
# # @Author : fry
# @FileName: 6_2_his_rgb.py
# ------------------------------------------------------------------------------
import cv2
import matplotlib.pyplot as plt
def image_hist(image): #画三通道图像的直方图
color = ("blue", "green", "red")#画笔颜色的值可以为大写或小写或只写首字母或大小写混合
for i, color in enumerate(color):
# 计算直方图函数
# src-img; channel; mask; bin多少个灰度级; range[0-256],像素值范围; 除了mask其他都要 []
hist = cv2.calcHist([image], [i], None, [256], [0, 256])
plt.plot(hist, color=color)
plt.xlim([0, 256])
plt.show()
image = cv2.imread('./img/5.jpg', 1)
cv2.namedWindow("img",cv2.WINDOW_NORMAL)
cv2.imshow('img', image)
image_hist(image)
cv2.waitKey(0)
cv2.destroyAllWindows()
三通道直方图:
