OpenCV 和 Matplotlib 绘制图像直方图教程
import cv2
import numpy as np
import matplotlib.pyplot as plt
# 读取图像
img = cv2.imread('C:/Users/LENOVO/Desktop/c.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 计算彩色图像的直方图
hist1, _ = plt.hist(img.ravel(), 256)
hist2 = cv2.calcHist([img], [0], None, [256], [0, 255])
# 显示两个直方图
plt.subplot(2, 1, 1)
plt.imshow(img)
plt.title('原始图像')
plt.subplot(2, 2, 3)
plt.plot(hist1)
plt.title('Matplotlib 直方图')
plt.subplot(2, 2, 4)
plt.plot(hist2)
plt.title('OpenCV 直方图')
plt.tight_layout()
plt.show()
OpenCV 和 Matplotlib 绘制图像直方图教程
本教程将教你如何使用 OpenCV 和 Matplotlib 库在 Python 中绘制图像直方图。
什么是图像直方图?
图像直方图是一种图表,它显示了图像中每个像素强度值出现的频率。它提供有关图像对比度、亮度和像素分布的信息。
如何使用 OpenCV 和 Matplotlib 绘制直方图
以下是如何使用 OpenCV 和 Matplotlib 绘制图像直方图的分步指南:
-
导入必要的库: 首先,导入必要的库:
import cv2 import numpy as np import matplotlib.pyplot as plt -
加载图像: 使用
cv2.imread()函数加载图像:img = cv2.imread('C:/Users/LENOVO/Desktop/c.jpg') -
计算直方图: 你可以使用 Matplotlib 的
plt.hist()函数或 OpenCV 的cv2.calcHist()函数计算直方图。- 使用 Matplotlib:
这里,hist1, _ = plt.hist(img.ravel(), 256)img.ravel()将图像展平为一维数组,256指定直方图中的 bin 数量。 - 使用 OpenCV:
这里,hist2 = cv2.calcHist([img], [0], None, [256], [0, 255])[img]是输入图像数组,[0]是要计算直方图的通道(在本例中为蓝色通道),None表示没有使用掩码,[256]是 bin 数量,[0, 255]是像素值范围。
- 使用 Matplotlib:
-
显示直方图: 使用 Matplotlib 的绘图函数显示直方图:
plt.subplot(2, 1, 1) plt.imshow(img) plt.title('原始图像') plt.subplot(2, 2, 3) plt.plot(hist1) plt.title('Matplotlib 直方图') plt.subplot(2, 2, 4) plt.plot(hist2) plt.title('OpenCV 直方图') plt.tight_layout() plt.show()
常见错误和解决方案
在绘制直方图时,你可能会遇到一些常见错误:
1. TypeError: Image data of dtype object cannot be converted to float
此错误是因为 plt.imshow() 函数试图显示一个非图像数组。要解决此问题,请使用 plt.plot() 函数显示直方图数据,如上例所示。
2. MatplotlibDeprecationWarning: Auto-removal of overlapping axes is deprecated
此警告是因为 Matplotlib 的默认行为已更改。要解决此问题,请在创建子图时明确指定 ax.remove(),或者使用 plt.tight_layout() 函数自动调整子图之间的间距。
通过遵循本教程,你应该能够使用 OpenCV 和 Matplotlib 成功绘制图像直方图。直方图是理解和可视化图像数据的重要工具,可以帮助你分析图像属性。
原文地址: https://www.cveoy.top/t/topic/jtf6 著作权归作者所有。请勿转载和采集!