请教OpenCV/Matplotlib中绘制图像二维强度直方图的函数
显示二维强度直方图的OpenCV与Matplotlib方法
要实现你需要的二维强度直方图(类似热力图形式的联合分布可视化),可以用以下两种工具的函数:
一、OpenCV实现
核心用cv2.calcHist()计算二维直方图数据,再通过伪彩色映射将数值转化为可视化的热力图:
import cv2 import numpy as np # 读取图像 img = cv2.imread('your_image.jpg') # 转为灰度图(以梯度-强度的二维直方图为例) gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 计算x、y方向梯度作为两个维度的数据 sobelx = cv2.Sobel(gray, cv2.CV_64F, 1, 0, ksize=5) sobely = cv2.Sobel(gray, cv2.CV_64F, 0, 1, ksize=5) # 计算二维直方图:输入两个通道数据,设置分箱数和数值范围 hist = cv2.calcHist([sobelx, sobely], [0, 1], None, [64, 64], [-100, 100, -100, 100]) # 归一化到0-255范围,适配伪彩色映射 hist = cv2.normalize(hist, hist, 0, 255, cv2.NORM_MINMAX) # 用JET伪彩色显示直方图 cv2.imshow('2D Histogram', cv2.applyColorMap(hist.astype(np.uint8), cv2.COLORMAP_JET)) cv2.waitKey(0) cv2.destroyAllWindows()
二、Matplotlib实现
Matplotlib提供两种方式:直接用plt.hist2d()一键计算并绘制,或者先计算直方图数据再用plt.imshow()自定义显示:
方法1:用plt.hist2d()快速绘制
import cv2 import matplotlib.pyplot as plt img = cv2.imread('your_image.jpg') gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) sobelx = cv2.Sobel(gray, cv2.CV_64F, 1, 0, ksize=5) sobely = cv2.Sobel(gray, cv2.CV_64F, 0, 1, ksize=5) # 直接生成二维直方图热力图,自动添加颜色条 plt.hist2d(sobelx.ravel(), sobely.ravel(), bins=64, cmap='jet') plt.colorbar(label='Pixel Count') plt.xlabel('X Direction Gradient') plt.ylabel('Y Direction Gradient') plt.title('2D Intensity Histogram') plt.show()
方法2:先计算直方图再自定义显示
import cv2 import matplotlib.pyplot as plt import numpy as np img = cv2.imread('your_image.jpg') gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) sobelx = cv2.Sobel(gray, cv2.CV_64F, 1, 0, ksize=5) sobely = cv2.Sobel(gray, cv2.CV_64F, 0, 1, ksize=5) # 用numpy计算二维直方图数据 hist, x_bins, y_bins = np.histogram2d(sobelx.ravel(), sobely.ravel(), bins=64) # 用imshow显示,origin='lower'保证坐标轴方向正确 plt.imshow(hist.T, origin='lower', cmap='jet', extent=[x_bins[0], x_bins[-1], y_bins[0], y_bins[-1]]) plt.colorbar(label='Pixel Count') plt.xlabel('X Direction Gradient') plt.ylabel('Y Direction Gradient') plt.title('2D Intensity Histogram') plt.show()
两者特点对比:
- OpenCV的
calcHist()计算效率更高,适合处理超大图像; - Matplotlib的工具自带坐标轴、颜色条,可视化更规整,适合快速分析展示。
内容的提问来源于stack exchange,提问作者Aino
相关产品推荐
相关产品推荐

