数字图像处理-直方图分析

图像直方图分析及实验

1.1 使用 OpenCV 统计直方图

函数 cv2.calcHist 可以帮助我们统计一幅图像 的直方图。我们一起来熟悉一下这个函数和它的参数:

1
cv2.calcHist(images, channels, mask, histSize, ranges, hist, accumulate)
  • images:原图像(图像格式为 uint8 或 float32)。当传入函数时应该 用中括号 [] 括起来,例如:[img]。

  • channels:同样需要用中括号括起来,它会告诉函数我们要统计那幅图 像的直方图。如果输入图像是灰度图,它的值就是 [0];如果是彩色图像 的话,传入的参数可以是 [0],[1],[2] 它们分别对应着通道 B,G,R。

  • mask: 掩模图像。要统计整幅图像的直方图就把它设为 None。但是如 果你想统计图像某一部分的直方图的话,你就需要制作一个掩模图像,并使用它。(后边有例子)

  • histSize:BIN 的数目。也应该用中括号括起来,例如:[256]。

  • ranges: 像素值范围,通常为 [0,256]

  • hist:是一个 256x1 的数组作为返回值,每一个值代表了与次灰度值对应的像素点数目。

  • accumulate:是一个布尔值,用来表示直方图是否叠加。


代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import cv2
import numpy as np
from matplotlib import pyplot as plt

img1 = cv2.imread('28.png', 0)
# 别忘了中括号 [img],[0],None,[256],[0,256],只有 mask 没有中括号
hist1 = cv2.calcHist([img1], [0], None, [256], [0, 256])

img2 = cv2.imread('28.png')
color = ('b', 'g', 'r')
for i, col in enumerate(color):
histr = cv2.calcHist([img2], [i], None, [256], [0, 256])
plt.subplot(224), plt.plot(histr, color=col),
plt.xlim([0, 256]), plt.title('Histogram')


plt.subplot(221), plt.imshow(img1, 'gray'), plt.title('Image1')
plt.subplot(222), plt.hist(img1.ravel(), 256, [0, 256]),
plt.title('Histogram'), plt.xlim([0, 256])
plt.subplot(223), plt.imshow(cv2.cvtColor(img2, cv2.COLOR_BGR2RGB)), plt.title('Image2')
plt.show()

效果:

原图
直方图分析分析

对蓝色变量累积分布图:

B变量累积分布图

直方图均衡

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('28.png',0)
cv2.imshow('img1',img)

# 直方图均衡
equ = cv2.equalizeHist(img)
res = np.hstack((img,equ))
#stacking images side-by-side
cv2.imshow('img2',res)
cv2.waitKey()
cv2.destroyAllWindows()

直方图均衡之前

直方图均衡后

总结

本实验对图像的直方图进行分析,并进行图片的直方图均衡、直方图分析,了解直方图均衡方法,明白直方图均衡可以很好的均衡图片的像素分布。

当然本实验也有不足,没能很好地展现直方图均衡前后图片的变化。根据书上的学习可以预先知道,直方图分析可以使得灰度图片变得更清晰可读。


数字图像处理-直方图分析
https://yelelalearn.github.io/2024/04/14/数字图像处理-直方图分析/
作者
Yelearn
发布于
2024年4月14日
更新于
2024年4月15日
许可协议