#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. это неправильный способ изменения размера. Если ваше изображение содержит черные и белые линии поочередно в каждом пикселе по столбцам и строкам, в конечном итоге вы получите либо полное черное, либо белое изображение в конце. Правильный способ — использовать интерполяцию, как описано ниже.