Как создать тепловую карту на изображении с использованием координатных точек? - PullRequest
0 голосов
/ 23 марта 2019

У меня есть изображение патологии размером 1024 x 1360. У меня есть значения вероятности некоторых областей и координатных точек.Как я могу написать код для создания тепловой карты, используя координаты точек и значения вероятности по изображению.Детали формата файла значений вероятности (.csv) приведены ниже.Любая помощь будет высоко оценена.

Редактировать:

Формат файла CSV Загрузить файл .csv

Содержимое файла 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 из целых изображений слайдов и вычислил «значения вероятности» каждого патча.Теперь, основываясь на этом значении, я планирую создать тепловую карту.Но используя ваш код, я получаю вывод, как описано выше.Даже цветовая полоса отсутствует.Пожалуйста, помогите.

1 Ответ

1 голос
/ 25 марта 2019

Очистите ваши данные, генерируя тепловую карту

Во-первых, если вам неудобны глубокие вложенные данные, вы должны очистить свои данные в файле 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"]         

Полный рабочий фрагмент

Этот фрагмент не очень симпатичен, но он работает для предоставленного вами фиктивного набора данных и, как предполагается, довольно понятен в приведенном выше введении. Может потребоваться некоторая настройка, особенно для черчения .

#!/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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...