如何使用坐标点在图像上创建热图?

时间:2019-03-23 18:56:02

标签: python-3.x image-processing

我的病理图像尺寸为1024 x1360。我具有某些区域和坐标点的概率值。如何使用图像上的坐标点和概率值编写用于生成热图的代码。下面给出了概率值(.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

应该在哪个热图上生成图像示例Download the image here

预期的热图类型The generated Heatmap over images should be like this

应用@Paradox的代码后生成的结果 generated output

其他说明:

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

1 个答案:

答案 0 :(得分: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数据集。

使用熊猫处理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"]         

完整的代码段

此代码段不是很漂亮,但可以用于您提供的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()