0%

opencv_13_直方图处理

直方图是图像处理过程中的一种非常重要的分析工具。直方图从图像内部灰度级的角度对图像进行表述,包含十分丰富而重要的信息。从直方图的角度对图像进行处理,可以达到增强图像显示效果的目的。

在绘制直方图时,将灰度级作为x轴,该灰度出现的次数作为y轴处理。

绘制直方图

使用Numpy绘制直方图

1
2
3
4
import cv2
from get_show_img import get_show
o = cv2.imread('data/dog1.jpg')
get_show(o, figsize=[6, 6])

13output_3_0

1
2
3
import matplotlib.pyplot as plt
plt.hist(o.ravel(), 256)
plt.show()


13output_4_0

将灰度级划分为16组。

1
2
plt.hist(o.ravel(), 16)
plt.show()

13output_6_0

使用opencv绘制直方图

cv2.calcHist(images, channels, mask, histSize, ranges, accumulate)

  • images: 原始图像,该图像需要用[]括起来。
  • channels: 指定的通道编号. 通道编号用[]括起来,灰度图像对应[0],彩色图像R、G、B分别对应[0]、[1]、[2]。
  • mask: 掩膜图像。当统计整幅图像时,设定为None。
  • histSize: BINS的值,该值需要用[]括起来。
  • ranges: 像素范围。
  • accumulate: 累计(累积、叠加)标识,默认值为False。如果被设置为True,则直方图在开始计算时不会被清零,计算的是多个直方图的累积结果,用于对一组图像计算直方图。
1
hist = cv2.calcHist([o], [0], None, [256], [0, 255])
1
hist.shape
(256, 1)
1
hist.size
256
1
print(type(hist))
<class 'numpy.ndarray'>
1
2
plt.plot(hist)
plt.show()


13output_13_0

将多个通道的直方图绘制到一幅图像中

1
2
3
hist0 = cv2.calcHist([o], [0], None, [256], [0, 255])
hist1 = cv2.calcHist([o], [1], None, [256], [0, 255])
hist2 = cv2.calcHist([o], [2], None, [256], [0, 255])
1
2
3
4
plt.plot(hist0)
plt.plot(hist1)
plt.plot(hist2)
plt.show()

13output_16_0

使用掩膜图像绘制直方图

1
import numpy as np
1
2
img = cv2.imread('data/dog1.jpg', 0)
mask = np.zeros_like(img)
1
mask[200:500, 200:500] = 255
1
2
3
4
5
hist = cv2.calcHist([img], [0],None, [256], [0, 255])
hist_mask = cv2.calcHist([img], [0], mask, [256], [0, 255])
plt.plot(hist)
plt.plot(hist_mask)
plt.show()


13output_21_0

直方图均衡化

如果一幅图像拥有全部可能的灰度级,并且像素值的灰度均匀分布,那么这幅图像就具有高对比度和多变的灰色色调,灰度级丰富且覆盖范围较大。在外观上,这样的图像具有更丰富的色彩,不会过暗或者过亮。

1
2
3
eq1 = cv2.imread('data/equ.bmp', 0)
eq2 = cv2.imread('data/equ2.bmp', 0)
get_show(eq1, eq2)

13output_24_0

1
2
equ1 = cv2.equalizeHist(eq1)
get_show(eq1, equ1)

13output_25_0

1
2
equ2 = cv2.equalizeHist(eq2)
get_show(eq2, equ2)

13output_26_0

1
2
3
4
5
hist1 = cv2.calcHist([eq2], [0], None, [256], [0, 255])
hist2 = cv2.calcHist([equ2], [0], None, [256], [0, 255])
plt.plot(hist1)
plt.plot(hist2)
plt.show()


13output_27_0

1
2
3
4
5
6
plt.figure(figsize=[10, 5])
plt.subplot(121)
plt.hist(eq2.ravel(), 256)
plt.subplot(122)
plt.hist(equ2.ravel(), 256)
plt.show()


13output_28_0

-------------本文结束感谢您的阅读-------------