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

如何在Matplotlib的imshow图中高亮高于阈值的感兴趣区域边界?

在Matplotlib的imshow图中高亮阈值区域边界

当然可以实现这种效果,针对你提到的contour函数不适用的情况,这里提供两种可靠的方法:

方法1:使用scikit-image提取区域边界(推荐)

这种方法能精准提取高于阈值区域的连续边界,适合大多数场景:

import numpy as np
import matplotlib.pyplot as plt
from skimage.measure import find_contours

# 替换为你的实际2D数据
data = np.random.rand(20, 20)  # 示例随机数据
threshold = 0.7  # 自定义阈值

# 提取高于阈值区域的边界轮廓
contours = find_contours(data, threshold)

# 绘制基础imshow图
fig, ax = plt.subplots()
ax.imshow(data, cmap='viridis')

# 遍历并绘制所有边界
for contour in contours:
    # contour返回的是(y, x)格式,对应imshow的像素坐标
    ax.plot(contour[:, 1], contour[:, 0], linewidth=2, color='red')

plt.show()

关键说明:

  • find_contours会基于区域的实际形状提取连续边界,不受离散数据或非规则区域的限制,这是它比contour更适合你的场景的原因
  • 可以通过调整linewidth和color参数,匹配你示例图的高亮样式
  • 如果未安装scikit-image,执行pip install scikit-image即可

方法2:纯Numpy+Matplotlib实现(无额外依赖)

如果不想引入第三方库,可通过掩码边缘检测实现:

import numpy as np
import matplotlib.pyplot as plt

data = np.random.rand(20, 20)
threshold = 0.7

# 创建高于阈值的掩码
mask = data > threshold
# 检测掩码的边缘(对比相邻像素的差异)
edges = np.logical_xor(mask, np.pad(mask, 1, mode='constant')[:-2, :-2]) | \
        np.logical_xor(mask, np.pad(mask, 1, mode='constant')[2:, :-2]) | \
        np.logical_xor(mask, np.pad(mask, 1, mode='constant')[:-2, 2:]) | \
        np.logical_xor(mask, np.pad(mask, 1, mode='constant')[2:, 2:])

# 获取边缘坐标
y_coords, x_coords = np.where(edges)

# 绘制图像和边缘
fig, ax = plt.subplots()
ax.imshow(data, cmap='viridis')
# 用散点或连线绘制边缘,这里用散点示例
ax.scatter(x_coords, y_coords, color='red', s=8)

plt.show()

关键说明:

  • 这种方法通过对比掩码与周边像素的差异来识别边缘,适合简单的离散数据场景
  • 如果需要连续的线条而非散点,可以将边缘坐标按顺序连接(需额外处理坐标排序)

内容的提问来源于stack exchange,提问作者Hamza

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 13:37:47