Оцифровка тепловой карты и отображение пикселей в значения - PullRequest
0 голосов
/ 20 марта 2020

Я хотел бы оцифровать тепловую карту, панель D в этом источнике

image

В качестве первого шага я попытался прочитать изображение в opencv и получить матрицу

import cv2
from pprint import pprint


def read_as_digital(image):
    # mage dimensions
    h = image.shape[0]
    w = image.shape[1]
    print(h, w)
    pass


if __name__ == '__main__':

    image = cv2.imread('ip.jpg', 1)
    pprint(image)

    read_as_digital(image)

Я мог бы прочитать изображение как матрицу, но я не знаю, как указать начало ячеек (соответствующих различным вспомогательным участкам на панели D изображения) в тепловой карте , наконец, я хочу сопоставить пиксели со значениями.

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

EDIT1:

Я пытался получить значения при нажатии

Например, когда я рассматриваю небольшой подраздел тепловой карты, предоставленной в источнике

enter image description here

Я ожидаю получить среднее значение для каждая ячейка (вокруг желтых точек) на изображении. Нажатие в разных точках дает разные значения. Нажатие на ячейку, которая охлаждена enter image description here, дает различные значения RGB в разных точках.

Любое предложение о том, как получить среднее значение для каждой ячейки (например, enter image description here) будет очень полезно.

РЕДАКТИРОВАТЬ 2:

Я пробовал обновленный код.

enter image description here

Среднее значение для этого ((например, enter image description here)) работает очень хорошо. Однако существует проблема с ячейкой рядом с ней. Когда я щелкаю по соседней ячейке, среднее значение, отображаемое кодом, относится к 3 ячейкам одного цвета. Было бы очень хорошо, если бы существовал способ ограничить размер ячейки, например, указать границу, по которой среднее значение должно быть вычислено в коде. Изображение, представленное в редактировании 1, имеет 6 строк и 6 столбцов. Если мы рассматриваем это как матрицу 6 на 6, скажем, A, среднее значение должно быть получено для каждой записи Aijth матрицы.

1 Ответ

1 голос
/ 23 марта 2020
import cv2
import numpy as np

# print pixel value on click
def mouse_callback(event, x, y, flags, params):
    if event == cv2.EVENT_LBUTTONDOWN:
        # get specified color
        row = y
        column = x
        color = image[row, column]
        print('color = ', color)
        # calculate range
        thr = 20  # ± color range
        up_thr = color + thr
        up_thr[up_thr < color] = 255
        down_thr = color - thr
        down_thr[down_thr > color] = 0
        # find points in range
        img_thr = cv2.inRange(image, down_thr, up_thr)  # accepted range
        height, width, _ = image.shape
        left_bound = x - (x % round(width/6))
        right_bound = left_bound + round(width/6)
        up_bound = y - (y % round(height/6))
        down_bound = up_bound + round(height/6)
        img_rect = np.zeros((height, width), np.uint8)  # bounded by rectangle
        cv2.rectangle(img_rect, (left_bound, up_bound), (right_bound, down_bound), (255,255,255), -1)
        img_thr = cv2.bitwise_and(img_thr, img_rect)
        # get points around specified point
        img_spec = np.zeros((height, width), np.uint8)  # specified mask
        last_img_spec = np.copy(img_spec)
        img_spec[row, column] = 255
        kernel = np.ones((3,3), np.uint8)  # dilation structuring element
        while cv2.bitwise_xor(img_spec, last_img_spec).any():
            last_img_spec = np.copy(img_spec)
            img_spec = cv2.dilate(img_spec, kernel)
            img_spec = cv2.bitwise_and(img_spec, img_thr)
            cv2.imshow('mask', img_spec)
            cv2.waitKey(10)
        avg = cv2.mean(image, img_spec)[:3]
        print('mean = ', np.around(np.array(avg), 2))
        global avg_table
        avg_table[:, 6 - int(x / (width/6)), 6 - int(y / (height/6))] = avg
        print(avg_table)

# average value of each cell in 6x6 matrix
avg_table = np.zeros((3, 6, 6))

# create window and callback
winname = 'img'
cv2.namedWindow(winname)
cv2.setMouseCallback(winname, mouse_callback)

# read & display image
image = cv2.imread('ip.jpg', 1)
image = image[3:62, 2:118]  # crop the image to 6x6 cells
cv2.imshow(winname, image)
cv2.waitKey()  # press any key to exit
cv2.destroyAllWindows()

Обратите внимание, что OpenCV имеет цветной формат BGR вместо RGB. Так, если щелкнуть по красному цвету, будет напечатано, например, [0, 0, 255].

Вы можете изменить thr, чтобы настроить диапазон для принятых цветов.

Изображение обрезано, чтобы включить только 6 на 6 матричной части.

...