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