Как уменьшить размер изображения при обработке изображений (scipy/numpy/python)

Здравствуйте, у меня есть изображение (1024 x 1024), и я использовал команду «fromfile» в numpy, чтобы поместить каждый пиксель этого изображения в матрицу.

Как я могу уменьшить размер изображения (например, до 512 x 512), изменив эту матрицу a?

a = numpy.fromfile(( - path - ,'uint8').reshape((1024,1024))

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


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

Когда я посмотрел на результат, я обнаружил, что читатель, которого я получил, прочитал изображение и поместил его в «матрицу». Поэтому я изменил «массив» на матрицу.

Хосе сказал мне, что я могу взять только четный столбец и четную строку и поместить их в новую матрицу. Это уменьшит изображение до половины размера. Какую команду в scipy/numpy мне нужно использовать для этого?

Спасибо


person Hold_My_Anger    schedule 22.05.2011    source источник
comment
Вопрос в том, что вы не понимаете, как это сделать в Python, или вы не понимаете, как масштабировать изображение, или и то, и другое?   -  person talonmies    schedule 22.05.2011
comment
Длинный ответ заключается в том, что это зависит от типа изображения, которое вы только что прочитали. Короткий ответ/вопрос: почему вы не можете использовать библиотеку? Можете ли вы изменить размер PIL, а затем вы можете вызвать numpy.reshape()?   -  person Jordan    schedule 22.05.2011
comment
изображение имеет расширение файла .dat, и программа для чтения, которую я получил, может прочитать изображение и поместить его в матрицу. Я сделал ошибку, поэтому я отредактировал сообщение и изменил массив на матрицу, поскольку он помещен в виде матрицы.   -  person Hold_My_Anger    schedule 23.05.2011
comment
Теперь у меня проблема, как взять только четную строку и четный столбец из матрицы. Есть ли какая-нибудь функция в scipy или numpy, которая может это сделать?   -  person Hold_My_Anger    schedule 23.05.2011


Ответы (3)


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

person José Carlos Méndez    schedule 22.05.2011
comment
@LearnMore — это так же просто, как y = x[::2, ::2] (или ::3, если вам нужна каждая третья строка и т. д.). Просто имейте в виду, что это вызовет проблемы с наложением имен, так как это, по сути, просто интерполяция ближайшего соседа (хотя это очень, очень быстро). Ответ @tillsten в целом намного лучше, но будет иметь больше накладных расходов. Все зависит от того, что именно вам нужно сделать. - person Joe Kington; 23.05.2011
comment
@ Джо Кингтон - спасибо. y = x [:: 2, :: 2] - это первое :: 2 означает получение каждых 2 строк, а второе :: 2 означает получение каждых 2 столбцов? и является ли x матрицей, которая у меня была изначально, а y - новой матрицей? - person Hold_My_Anger; 23.05.2011
comment
Да, я пробовал, и изначально размер был 2048 x 2048. Сейчас 1024 x 1024. Большое спасибо. - person Hold_My_Anger; 23.05.2011
comment
Однако правильный способ сделать это описан ниже. Используйте функцию масштабирования. - person Bogdan; 02.12.2014
comment
это неправильный способ изменения размера. Если ваше изображение содержит черные и белые линии попеременно в каждом столбце и строке пикселей, в конце вы получите либо полное черное, либо белое изображение. Правильный способ - использовать интерполяцию, как описано ниже. - person London guy; 02.10.2015

Если вы хотите изменить размер до определенного разрешения, используйте scipy.misc.imresize:

import scipy.misc

i_width = 640
i_height = 480

scipy.misc.imresize(original_image, (i_height, i_width))
person Mika Vatanen    schedule 16.08.2016
comment
Я думаю, что это правильный ответ. Простой, работает напрямую с форматом изображения массива numpy. Спасибо! - person Ruby; 26.06.2017
comment
он устарел в scipy 1.0.0, следует использовать skimage.transform.resize - person CrowbarKZ; 08.11.2017
comment
К сожалению, альтернатива skimage в настоящее время не имеет опции ближайшего соседа, поэтому, если вам нужно, скажем, уменьшить размер данных датчика с 1280 до 224, вам придется самостоятельно выполнить дополнительные математические операции. - person bjorke; 15.03.2018

Используйте функцию масштабирования из scipy:

http://docs.scipy.org/doc/scipy/reference/generated/scipy.ndimage.zoom.html#scipy.ndimage.zoom

from scipy.ndimage.interpolation import zoom
a = np.ones((1024, 1024))
small_a = zoom(a, 0.5)
person tillsten    schedule 22.05.2011