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

#python #image #image-processing #numpy #scipy

#python #изображение #обработка изображений #numpy #scipy

Вопрос:

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

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

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

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


Редактировать:

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

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

Спасибо

Комментарии:

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

2. Длинный ответ заключается в том, что это зависит от типа изображения, в котором вы только что прочитали. Короткий ответ / вопрос: «почему вы не можете использовать библиотеку?». Можете ли вы заставить PIL изменить его размер, а затем вызвать numpy.reshape()?

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

4. Теперь у меня проблема в том, как взять из матрицы только четную строку и четный столбец. Есть ли какая-либо функция в scipy или numpy, которая может это сделать?

Ответ №1:

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

 import scipy.misc

i_width = 640
i_height = 480

scipy.misc.imresize(original_image, (i_height, i_width))
  

Комментарии:

1. Я думаю, что это правильный ответ. Простой, работает непосредственно с форматом массива numpy изображения. Спасибо!

2. в scipy 1.0.0 он устарел, следует использовать skimage.transform.resize

3. К сожалению, альтернатива skimage в настоящее время не имеет опции «ближайший сосед», поэтому, если вам нужно, скажем, уменьшить размер данных датчика с 1280 до 224, вам нужно будет выполнить дополнительную математику самостоятельно.

Ответ №2:

Используйте функцию масштабирования из 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)
  

Ответ №3:

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

Комментарии:

1. @LearnMore — Это так же просто, как y = x[::2, ::2] (или ::3 , если вам нужна каждая третья строка и т.д.). Просто имейте в виду, что это вызовет проблемы с наложением псевдонимов, поскольку по сути это просто интерполяция «ближайшего соседа» (хотя это очень, очень быстро). Ответ @ tillsten в целом намного лучше, но будет иметь больше накладных расходов. Все зависит от того, что именно вам нужно сделать.

2. @Joe Kington — спасибо. y = x [::2, ::2] означает ли первое «::2» получение каждых 2 строк, а второе «::2» получение каждых 2 столбцов? и является ли x матрицей, которая у меня была изначально, а y — новой матрицей?

3. Да, я пробовал это, и изначально размер был 2048 x 2048. Теперь это 1024 x 1024. Большое спасибо

4. Однако правильный способ сделать это описан ниже. Используйте функцию масштабирования.

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