You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

请教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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 16:32:34