我的病理图像尺寸为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
其他说明:
“ p”是在该特定区域患癌或未患癌的概率值。我从整个幻灯片图像中提取了大小为256 x 256的所有补丁,并计算了每个补丁的“概率值”。现在,基于该值,我计划生成热图。但是通过使用您的代码,我得到的输出如上所述。甚至彩条都不见了。请帮忙。
答案 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数据集。
看看您的用例是什么,我建议使用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()