Просмотр изображения размера (4, 6, 6) с движущимся окном размера (4, 3, 3) - PullRequest
0 голосов
/ 02 сентября 2018

Я хотел просмотреть изображение, используя метод движущегося окна, и рассчитать среднее значение для каждого окна:

import numpy as np
from skimage.util import view_as_windows

image = np.ones((6,6)) # A single channel image
print (image.shape)
(6, 6)
result = view_as_windows(image, window_shape=(3,3), step=1)
print (result.shape)

(4, 4, 3, 3)

mean = np.mean(result, axis=(2,3))
print (mean.shape)    
(4, 4)

Но не удалось сделать это для 3D-изображения.

Я хотел просмотреть его с размером окна (3, 3), используя все каналы (4).

image = np.ones((4, 6, 6)) #image with 4 channels
print (image.shape)

(4, 6, 6)

result = view_as_windows(image, window_shape=(4,3,3), step=1)
print (result.shape)

(1, 4, 4, 4, 3, 3)

mean = np.mean(result, axis=(4,5))
print (mean.shape)

(1, 4, 4, 4)

Ответы [ 2 ]

0 голосов
/ 02 сентября 2018

При условии, что ваше изображение является трехмерным массивом, view_as_windows дает 6-мерный массив. Если вы хотите вычислить среднее значение каждого окна, используя векторизованный код, а не через циклы for, вам просто нужно передать последние три оси в mean NumPy следующим образом:

In [18]: img = np.ones((4, 6, 6))

In [19]: windows = view_as_windows(image, window_shape=(4, 3, 3), step=1)

In [20]: windows.shape
Out[20]: (1, 4, 4, 4, 3, 3)    

In [21]: avg = np.mean(windows, axis=(-1, -2, -3))

In [22]: avg.shape
Out[22]: (1, 4, 4)

In [23]: avg
Out[23]: 
array([[[1., 1., 1., 1.],
        [1., 1., 1., 1.],
        [1., 1., 1., 1.],
        [1., 1., 1., 1.]]])

Описание параметра axis из документов :

ось: Нет или int или кортеж целых чисел, необязательно

Ось или оси, по которым вычисляются средние значения. По умолчанию вычисляется среднее значение уплощенного массива.
Новое в версии 1.7.0.
Если это кортеж целых чисел, среднее значение выполняется по нескольким осям, а не по одной оси или по всем осям, как раньше.

0 голосов
/ 02 сентября 2018

у вас есть конечный размер здесь. отменить это с помощью:

view_as_windows(image, window_shape=(4,3,3)).squeeze()

тогда размеры будут:

(4, 6, 6)
(4, 4, 4, 3, 3)
(4, 4, 4) 

Что я думаю, это то, что вы хотите.

...