如何使用Python数字化(从中提取数据)热图图像?

时间:2018-03-25 00:52:47

标签: python heatmap data-extraction

Example of heat map

有几个包可用于数字化折线图,例如GetData Graph Digitizer
但是,对于热图的数字化,我找不到任何包裹或程序。

我想用Python数字化热图(来自png或jpg格式的图像)。怎么做?
我是否需要从头开始编写完整的代码? 或者有任何可用的套餐?

1 个答案:

答案 0 :(得分:3)

有多种方法可以做到这一点,许多机器学习库提供自定义可视化功能......更容易或更难。

您需要将问题分成两半。

首先,使用OpenCV for python或scikit-image,首先必须将图像作为矩阵加载。您可以在单元格的开头设置一些偏移量。

import cv2    
# 1 - read color image (3 color channels)
image = cv2.imread('test.jpg',1)

然后,您将通过单元格迭代并读取内部颜色。您可以根据需要对结果进行标准化。我们引入一些偏移的原因是因为热图不会在原始图像的左上角(0,0)处开始。 offset_x和offset_y将是每个包含2个值的列表。

  • offset_x [0] :从图像左侧到热图开头的偏移量(即start_of_heatmap_x)
  • offset_x [1] :从图像右边部分到热图结尾的偏移量(即image_width - end_of_heatmap_x)
  • offset_y [0] :从图像顶部到热图的开始的偏移量(即start_of_heatmap_y)
  • offset_y [1] :从图像底部到热图结尾的偏移量(即image_height - end_of_heatmap_y)

Heatmap offsets

另外,我们不会迭代到最后一列。那是因为我们从" 0-th"列,我们在每个基本局部坐标上添加cell_size / 2以获取单元格的中心值。

def read_as_digital(image, cell_size, offset_x, offset_y):
    # grab the image dimensions
    h = image.shape[0]
    w = image.shape[1]
    results = []
    # loop over the image, cell by cell 
    for y in range(offset_y[0], h-offset_y[1]-cell_size, cell_size):
       row = []
       for x in range(offset_x[0], w-offset_x[0]-cell_size, cell_size):
            # append heatmap cell color to row
            row.append(image[x+int(cell_size/2),y+int(cell_size/2)])
       results.append(row)

    # return the thresholded image
    return results

提取图例信息并不难,因为我们可以通过限制来获取值(尽管这适用于线性比例)。

因此,例如,我们可以在图例中推导出步骤(来自x和y)。

def generate_legend(length, offset, cell_size, legend_start, legend_end):
    nr_of_cells = (length- offset[0] - offset[1])/cell_size
    step_size = (legend_end - legend_start)/nr_of_cells
    i=legend_start+step_size/2  # a little offset to center on the cell

    values = []
    while(i<legend_end):
        values.append(i)
        i = i+step_size
    return values

然后你想要想象它们,看看是否一切都做得对。例如,使用seaborn它很容易[1]。如果你想要更多的控制权,那么......你可以使用scikit learn和matplotlib [2]