Пользовательское изображение в оттенках серого с NumPy, OpenCV и Python - PullRequest
1 голос
/ 30 сентября 2019

Я хочу усреднить фрагмент массива (это изображение).

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

Я использовал openCV, чтобы прочитать изображение в массив с формой 640,480,3, и я хочу изменить каждый из последних битов, то есть [123,121,234] к среднему значению этого среза для каждого из 640x480.

Вам не нужно давать мне ответ, но было бы полезно толкнуть в правильном направлении.

Вот чтомедленно для меня:

 def bw_image_arr(self):

    for x in self.images:
        for y in x:
            for z in y:
                z = z.mean()

Ответы [ 2 ]

1 голос
/ 30 сентября 2019

Используйте axis аргумент для уменьшения среднего значения вдоль последней оси, а затем передайте в исходную форму с np.broadcast_to -

np.broadcast_to(images.mean(axis=-1,keepdims=True),images.shape)

Тоnp.broadcast_to помогает нам в достижении эффективности использования памяти, предоставляя нам оригинальный фасонный вид усредненного массива. Если вам нужен конечный вывод с собственным пространством памяти, добавьте .copy() -

np.broadcast_to(images.mean(axis=-1,keepdims=True),images.shape).copy()

В качестве альтернативы мы можем использовать np.repeat -

images.mean(axis=-1,keepdims=True).repeat(images.shape[-1],axis=-1)

Опубликованные решения работают дляndarrays общих размеров. Следовательно, будет работать с одним изображением или набором изображений с желаемым результатом усреднения по последней оси, транслируемой / реплицируемой / повторяемой по той же оси.

Также обратите внимание, что конечный результат будет float dtype. Таким образом, мы можем захотеть преобразовать или / и округлить до int для обычного image-dtype вывода unsigned-int dtype.

1 голос
/ 30 сентября 2019

Вам нужно усреднить по осям X и Y. В вашем случае оси 1 и 2 (вы можете ввести его в numpy.mean как кортеж). Тогда, если у вас есть 50 изображений в первом примере измерения, вы получите (50, 3) фигурный массив.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...