Как создать тепловую карту над изображением, используя координатные точки?

#python-3.x #image-processing

#python-3.x #обработка изображений

Вопрос:

У меня есть изображение патологии размером 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. Не могли бы вы, пожалуйста, опубликовать фактические текстовые значения вместо изображения?

2. @Nathaniel Спасибо за ваш ответ. Я обновил свой запрос и предоставил ссылку для загрузки. Я новичок в этой области. Пожалуйста, помогите мне.

3. Можете ли вы объяснить значение столбцов в CSV? В строке 3 Probability value равно 3, что кажется неправильным.

4. @RohitNamjoshi Это всего лишь образец данных. Вы можете изменить значение вероятности на 0.3

5. Что насчет остальных строк / столбцов, что они представляют?

Ответ №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 фрейме данных:

 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()
  

Комментарии:

1. Просто небольшое изменение: print(row["x"], row["y"], row["x1"], row["y1"], row["p"]) . Большое спасибо. Код работает.

2. Вы изменили файл данных CSV? В противном случае я не вижу, откуда берется p .

3. «p» — это значение вероятности наличия рака или его отсутствия в этой конкретной области. Я извлек все исправления размером 256 x 256 из целых изображений слайдов и вычислил «значения вероятности» каждого исправления. Теперь на основе этого значения я планирую сгенерировать тепловую карту. Но, используя ваш код, я получаю вывод, подобный приведенному выше [пожалуйста, проверьте область основного вопроса]. Отсутствует даже цветовая полоса.

4. Итак, p это Probability value из вашего CSV-файла, верно? Что касается графика, вы использовали фиктивный набор данных, а не фактический, которым вы не поделились в своем сообщении. Что касается цветовой панели, единственное, что нужно было попросить об этом. Все это должно быть в исходном сообщении. На самом деле это была именно та «заминка», которую я ожидал с частичным вопросом, как я сказал в одном из комментариев к OP. Может быть, было бы лучше, если бы вы могли описать реальную и завершенную проблему в своем вопросе, если вам слишком сложно найти решение на моем примере для вашего фиктивного набора данных.

5. Это потому, что диапазон отображения находится между 0 и 1, что не относится к значениям исходного изображения. С этим можно справиться другими методами, но самый простой способ получить что-то, что работает, — это изменить диапазон отображения с помощью imshow , вот так ax[1].imshow(img, vmin=0, vmax=1) . Цветовая панель также должна ссылаться на изображение. Я отразил это в обновленном коде. Надеюсь, вы будете довольны результатом. Обратите внимание, что было бы проще с реальным набором данных посмотреть, совпадает ли достигнутый результат с показанным в вашем вопросе.