2016-10-06 2 views
0

У меня есть изображение, прочитанное в np.array от PIL. В моем случае это (1000, 1500)np.array.упростить отображение массива numpy изображения

Я бы хотел упростить его для визуализации. упрощения, я следующее преобразование из этой матрицы

1 1 1 1 0 0 
1 0 1 0 0 0 

в

1 1 0 

так, по существу, смотреть на каждый 2*2 образце, если он удовлетворяет определенные критерии, как более чем на 50% от 1-х -> считайте его как 1, если нет, счет равен 0.

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

+1

математическое процедура, я думаю, вы говорите о часто упоминается как «downsampling» [Wikipedia] (https://en.wikipedia.org/wiki/Comparison_gallery_of_image_scaling_algorithms) имеет небольшую страницу с визуальным сравнением нескольких популярных методов. – Aaron

ответ

1

Использование комбинации np.reshape() и np.sum(array) с axis аргумента .:

import numpy as np 
a = np.array([[1, 1, 1, 1, 0, 0], [1, 0, 1, 0, 0, 0]]) 
a = np.reshape(a, (a.shape[0]/2, 2, a.shape[1]/2, 2)) 
a = np.sum(a, axis=(1, 3)) >= 2 

Перестройка групп в массиве небольших блоков 2х2 (Первородные оси длины должны быть кратны 2), я затем использовать сумму вдоль созданная ось для проверки того, что по меньшей мере 4 значения в группе равны 1.

См. Computing average for numpy array для аналогичного вопроса.

+0

Не должно быть '> 2' вместо этого? – Divakar

+0

@ Дивакар Я прочитал «хотя бы одна запись одна». Исправлена ​​! –

1

Вы можете использовать PIL.Image.fromarray, чтобы сделать снимок в PIL, затем resize или преобразовать это изображение в thumbnail нужного вам размера. одним преимуществом является то, что это можно легко сохранить в файл, нарисовать на холсте или отобразить для отладки. только помните о числовых типах и режимах изображения (я часто попадаю в ловушку).

создание образа осуществляется:

from PIL import Image 
image = Image.fromarray(arr).astype(np.uint8) #unsigned bytes for 8-bit grayscale 
smallerImage = image.resize(desired_size, resample=Image.BILINEAR) #resize returns a copy thumbnail modifies in place 

Получение изображения обратно в Numpy массив так просто, как: np.array(image.getdata()).reshape(image.size)

Смежные вопросы