直方图的本质:统计每个像素灰度出现的概率,所以它的横坐标为0-255,是灰度等级
纵坐标为其出现频率。
首先是彩色图片的直方图,画的是rgb三元色的直方图,代码如下:
import cv2
import matplotlib.pyplot as plt
import numpy as np
img = cv2.imread('OpenCV\\image0.JPG',1)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
# 分别求b,g,r出现的概率
count_b = np.zeros(256, np.float)
count_g = np.zeros(256, np.float)
count_r = np.zeros(256, np.float)
for i in range(height):
for j in range(width):
(b,g,r) = img[i,j]
index_b = int(b) # 将np. 数据类型转换为int
index_g = int(g)
index_r = int(r)
count_b[index_b] = count_b[index_b] + 1
count_g[index_g] = count_g[index_g] + 1
count_r[index_r] = count_r[index_r] + 1
for i in range(256):
count_b[i] = count_b[i]/(height*width)
count_g[i] = count_g[i]/(height*width)
count_r[i] = count_r[i]/(height*width)
# 定义x轴坐标
x = np.linspace(0,255,256)
# 绘制图像
y1 = count_b
plt.figure()
plt.bar(x, y1, 0.9, alpha=1, color='b')
y2 = count_g
plt.figure()
plt.bar(x, y2, 0.9, alpha=1, color='g')
y3 = count_r
plt.figure()
plt.bar(x, y3, 0.9, alpha=1, color='r')
plt.show()
# 优化后的绘图
# 绘制图像
plt.figure(figsize=(25,5)) # figsize调整图像大小
ax1 = plt.subplot(1,3,1) # 一行三列的子图的第一个位置
ax2 = plt.subplot(1,3,2)
ax3 = plt.subplot(1,3,3)
# 调整子图之间的间距
plt.tight_layout(pad=0.4, w_pad=5, h_pad=1.0)
plt.sca(ax1) # 选择 ax1
y1 = count_b
plt.bar(x, y1, 0.9, alpha=1, color='b')
plt.sca(ax2) # 选择 ax2
y2 = count_g
plt.bar(x, y2, 0.9, alpha=1, color='g')
plt.sca(ax3) # 选择 ax3
y3 = count_r
plt.bar(x, y3, 0.9, alpha=1, color='r')
plt.show()
优化后的绘图:
下面是灰度图像直方图。
import cv2
import matplotlib.pyplot as plt
import numpy as np
img = cv2.imread('OpenCV\\image0.JPG', 1)
ImgInfo = img.shape
height = ImgInfo[0]
width = ImgInfo[1]
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
count = np.zeros(256, np.float) # 建立一个大小为256的数组
for i in range(height):
for j in range(width):
pixel = gray[i,j] # 图像中像素值的类型是np.uint8
index = int(pixel)
# 0-255的下标,意味着0-255的灰度等级,每当符合其灰度等级,就在count数组中的对应位置加一
count[index] = count[index] + 1
# 计算每种灰度出现的概率
for i in range(255):
count[i] = count[i]/(height*width)
# 用matplot绘图
x = np.linspace(0,255,256)
y = count
plt.bar(x, y, width=0.8, alpha=1, color='b')
plt.show()
结果如下: