挑战图像处理100问(20)——灰度直方图
关于灰度直方图
灰度直方图是反映一幅图像中各灰度级像素出现的频率与灰度级的关系,以灰度级为横坐标,频率为纵坐标,绘制频率同灰度级的关系图像就是一幅灰度图像的直方图。
简单地说,就是把一幅图像中每一个像素出现的次数都先统计出来,然后把每一个像素出现的次数除以总的像素个数,得到的就是这个像素出现的频率,然后再把像素与该像素出现的频率用图表示出来,就是灰度直方图。
代码实现
import numpy as np
import matplotlib.pyplot as plt
from skimage.io import imread # 用来读取图片
%matplotlib inline
# 读取图片
path = 'C:/Users/86187/Desktop/image/'
file_in = path + 'cake.jpg'
img = imread(file_in)
plt.figure
imgshow = plt.imshow(img)
# 灰度化
# 灰度化函数
def BGR2GRAY(img):
# 获取图片尺寸
H, W, C = img.shape
# 灰度化
out = np.ones((H,W,3))
for i in range(H):
for j in range(W):
out[i,j,:] = 0.299*img[i,j,0] + 0.578*img[i,j,1] + 0.114*img[i,j,2]
out = out.astype(np.uint8)
return out
img = BGR2GRAY(img)
plt.figure
imgshow = plt.imshow(img)
img_ = img.copy()
img_ = img_.reshape(-1)
hist = plt.hist(img_, bins=255, rwidth=0.85, range=(0,255))
直方图的一些性质:
1、灰度直方图只能反映图像的灰度分布情况,而不能反映图像像素的位置,即丢失了像素的位置信息;
2、一幅图像对应唯一的灰度图像图,但是不同的图像可对应相同的直方图;
3、一幅图像分成多个区域,多个区域的直方图之和即为原图像的直方图。
直方图有一个应用就是它可以确定图像二值化的阈值。当我们的发现某一幅图像的灰度直方图中有两个波峰,有一个波谷的话,那么这个波谷就可以作为这幅图像二值化的阈值。