【问题标题】:How to create heatmap over an image using coordinate points?如何使用坐标点在图像上创建热图?
【发布时间】:2019-06-03 21:37:30
【问题描述】:

我有一张大小为 1024 x 1360 的病理图像。我有一些区域和坐标点的概率值。如何使用图像上的坐标点和概率值编写热图生成代码。下面给出概率值 (.csv) 文件格式的详细信息。任何帮助将不胜感激。

编辑:

CSV 文件格式Download .csv file

CSV 文件内容:

(x,y)        (x, y+y1)    (x+x1, y)    (x+x1, y+y1) Probability value
(0,0)        (0, 5)       (10, 0)      (10, 5)      0.5
(50,45)      (50, 65)     (55, 45)     (55, 65)     0.9
(100, 150)   (100, 200)   (120, 150)   (120, 200)   0.3
(1000, 1005) (1000, 1010) (1005, 1005) (1005, 1010) 1

应生成热图的示例图像 [![在此处下载图像][2]][2]

预期的热图类型 [![生成的图像上的热图应该是这样的][3]][3]

应用@Paradox 的代码后生成的结果 [![生成的输出][4]][4]

补充说明:

“p”是该特定区域是否患有癌症的概率值。我已经从整个幻灯片图像中提取了所有大小为 256 x 256 的补丁,并计算了每个补丁的“概率值”。现在基于该值,我计划生成热图。但是通过使用你的代码,我得到了像上面这样的输出。连彩条都不见了。请帮忙。

【问题讨论】:

  • 能否请您发布实际的文本值而不是图像?
  • @Nathaniel 感谢您的回复。我已经更新了我的查询并给出了可下载的链接。我是这个领域的新手。请帮帮我。
  • 您能解释一下 CSV 中各列的含义吗?在第 3 行中,Probability value 是 3,这似乎不正确。
  • @RohitNamjoshi 这只是一个示例数据。您可以将概率值更改为 0.3
  • 其余的行/列代表什么?

标签: python-3.x image-processing


【解决方案1】:

清理生成热图的数据

首先,如果您对深度嵌套的数据不满意,您应该清理 CSV 文件中的数据(它们不统一并且有重复 - 如果您想要矩形,它们也容易出错)。

最简单的例子如下:

 x, y, x1, y1, Probability value
 0, 0, 5, 10, 0.5
 50, 45, 55, 65, 0.9
 100, 150, 120, 200, 0.3
 1000, 1005, 1005, 1010, 1

下面的答案是根据这个干净的 CSV 数据集编写的。

使用 Pandas 处理 CSV 数据文件

看看您的用例是什么,我建议使用pandas 来处理您的 CSV 数据文件。

您可以通过这种方式将 CSV 文件中的数据存储在 pandas DataFrame 中:

df = pd.read_csv("data.csv")

并遍历行,使用第一行作为每个列值的键,如下所示:

for index, row in df.iterrows():
    print(row["x"], row["y"], row["x1"], row["y1"], 
      row["Probability value"]         

完整的工作 sn-p

这个 sn-p 不是很漂亮,但它适用于您提供的dummy dataset,并且旨在通过上述介绍非常不言自明。 可能需要进行一些调整,尤其是绘图部分

#!/usr/bin/python3
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from skimage import io
from skimage.color import rgb2gray
import matplotlib as mpl
# Read original image
img = io.imread('img.jpg')

# Get the dimensions of the original image
x_dim, y_dim, z_dim = np.shape(img)

# Create heatmap
heatmap = np.zeros((x_dim, y_dim), dtype=float)

# Read CSV with a Pandas DataFrame
df = pd.read_csv("data.csv")

# Set probabilities values to specific indexes in the heatmap
for index, row in df.iterrows():
    x = np.int(row["x"])
    y = np.int(row["y"])
    x1 = np.int(row["x1"])
    y1 = np.int(row["y1"])
    p = row["Probability value"]
    heatmap[x:x1,y:y1] = p

# Plot images
fig, axes = plt.subplots(1, 2, figsize=(8, 4))
ax = axes.ravel()

ax[0].imshow(img)
ax[0].set_title("Original")
fig.colorbar(ax[0].imshow(img), ax=ax[0])

ax[1].imshow(img, vmin=0, vmax=1)
ax[1].imshow(heatmap, alpha=.5, cmap='jet')
ax[1].set_title("Original + heatmap")

# Specific colorbar
norm = mpl.colors.Normalize(vmin=0,vmax=2)
N = 11
cmap = plt.get_cmap('jet',N)
sm = plt.cm.ScalarMappable(cmap=cmap, norm=norm)
sm.set_array([])
plt.colorbar(sm, ticks=np.linspace(0,1,N), 
             boundaries=np.arange(0,1.1,0.1)) 

fig.tight_layout()
plt.show()

【讨论】:

  • 只是一个小改动:print(row["x"], row["y"], row["x1"], row["y1"], row["p"])。非常感谢。代码正在运行。
  • 您更改了 CSV 数据文件?否则,我看不到 p 来自哪里。
  • “p”是该特定区域是否患有癌症的概率值。我从整个幻灯片图像中提取了所有大小为 256 x 256 的补丁,并计算了每个补丁的“概率值”。现在基于该值,我计划生成热图。但是通过使用您的代码,我得到了如下所示的输出[请检查主要问题区域]。连彩条都不见了。
  • 所以,p 是您 CSV 文件中的 Probability value,对吧?关于情节,您使用的是虚拟数据集,而不是您未在帖子中分享的实际数据集。关于颜色条,唯一的事情就是要求它。所有这些都应该在原始帖子中。这实际上正是我对部分问题所期待的那种“打嗝”,就像我在其中一个 OP cmets 中所说的那样。如果你能在你的问题中提出实际和完整的问题,如果你很难用我的例子在你的虚拟数据集上提出解决方案,也许会更好。
  • 这是因为显示范围在0到1之间,而不是原始图像的值。您可以使用不同的方法来处理它,但最简单的方法是通过imshow 更改显示范围,例如ax[1].imshow(img, vmin=0, vmax=1)。颜色条也需要参考图像。我在更新的代码中反映了这一点。希望你会对结果感到满意。请注意,使用实际数据集查看所获得的结果是否与您的问题中显示的相同会更简单。
猜你喜欢
  • 1970-01-01
  • 2019-01-20
  • 1970-01-01
  • 2014-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多