Извлечение значений пикселей из изображения (массив 2d) в определенных координатах с использованием маски - PullRequest
0 голосов
/ 26 апреля 2018

У меня есть стек изображения 512x512 пикселей, из которого я извлекаю список координат x и y для локальных максимумов, используя peak_local_max(tmp_frame, min_distance=15,threshold_abs=3000), которые возвращают мне координаты пикселей в массиве массивов.

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

def createCircularMask(h, w, center=None, radius=None):

    if center is None: # use the middle of the image
        center = [int(w/2), int(h/2)]
    if radius is None: # use the smallest distance between the center and image walls
        radius = min(center[0], center[1], w-center[0], h-center[1])

    Y, X = np.ogrid[:h, :w]
    dist_from_center = np.sqrt((X - center[0])**2 + (Y-center[1])**2)

    mask = dist_from_center <= radius
    return mask

Я хочу применить свою маску к моим координатам x и y, чтобы получить суммарные значения пикселей вокруг локальных максимумов и сохранить их в списке.

Однако я не могу найти функцию, которая позволяет мне применять маску только к заданным местоположениям в двумерном массиве?

Ответы [ 2 ]

0 голосов
/ 28 апреля 2018

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

import numpy as np

np.random.seed(2018)
img = np.random.random(size=(512, 512))
rows, cols = np.ogrid[:img.shape[0], :img.shape[1]]

coords = [[100, 100], [200, 300], [300, 100], [400, 400]]
radius = 75

local_sum = []
for row, col in coords:
    mask = np.sqrt((rows - row)**2 + (cols - col)**2) <= radius
    local_sum.append(np.sum(mask*img))

Результаты могут отображаться следующим образом:

import matplotlib.pyplot as plt
from matplotlib.patches import Circle

fig, ax = plt.subplots(1, 1)
ax.imshow(img, cmap='gray')
for i, [row, col] in enumerate(coords):
    ax.add_patch(Circle((col, row), radius=radius, color='red'))
    plt.text(col, row, '{:.2f}'.format(local_sum[i]), ha='center', va='center')
plt.show(fig)

results

0 голосов
/ 26 апреля 2018

люди обычно используют свёртку ядра scipy. пожалуйста, дайте мне знать, если это соответствует вашему вопросу.

from scipy import ndimage
a = np.array([[1, 2, 0, 0],[5, 3, 0, 4], [0, 0, 0, 7],[9, 3, 0, 0]])
k = np.array([[1,1,1],[1,1,0],[1,0,0]])

ndimage.convolve(a, k, mode='constant', cval=0.0)
array([[11, 10,  7,  4],
       [10,  3, 11, 11],
       [15, 12, 14,  7],
       [12,  3,  7,  0]])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...