#python #opencv #list-comprehension #image-resizing
#python #opencv #понимание списка #изменение размера изображения
Вопрос:
Мой вопрос состоит из двух частей, но сначала немного предыстории.
Я пытаюсь перебрать список изображений и по существу стандартизировать размер каждого из них, используя cv2.resize. Я успешно выполнял это со следующим циклом for, но количество изображений увеличилось и будет продолжать увеличиваться, что приведет к сбою моего ядра. Я пытался запустить этот код как в Spyder (Python 3.7), так и в Jupyter Notebook, но безрезультатно.
for i in range(len(image_list)):
image_list[i] = cv2.resize(image_list[i], (200,200))
Понимание списка для меня не очень интуитивно понятно; однако я попытался преобразовать приведенный выше код, но безуспешно. Это моя попытка:
image_list2 = [cv2.resize(image_list, (200,200)) for i in range(len(image_list))]
- Какие изменения я должен внести во второй блок кода?
- Является ли преобразование первого блока кода (цикла for) в понимание списка чем-то, что помогло бы избежать сбоя моего ядра? Я полагаю, что перегружаю оперативную память своего процессора, поскольку в «image_list» хранится так много изображений — в настоящее время ~ 50 000, но это число может утроиться.
Заранее благодарю вас за помощь, это действительно ценится.
Комментарии:
1. как это не удалось? можете ли вы объяснить, чем ваш результат отличается от результата составления списка?
2. почему вы сохраняете результаты в списке? что вы делаете с данными после этого? может быть, было бы лучше изменять размер каждого из них и записывать результаты на диск для каждой итерации … затем снова прочитать весь каталог, если вам нужно использовать их все сразу
3. «Я успешно выполнял это со следующим циклом for, но количество изображений увеличилось и будет продолжать увеличиваться, что приведет к сбою моего ядра» как понимание списка решает эту проблему?
4. Как вы создаете оригинал
image_list
? Из базы данных?
Ответ №1:
Ваш первый код тоже кажется неправильным. Вы не должны изменять размер image_list
, вы должны изменить размер image_list[i]
.
Для второго блока кода,
image_list2 = [cv2.resize(image, (200,200)) for image in image_list]
Я не уверен, что понимание списка решит вашу проблему. Как насчет сохранения нового изображения с измененным размером в файле на каждой итерации и загрузки его позже?
Комментарии:
1. Что касается моего первого блока кода: мои извинения за опечатку. На самом деле я изменял размер каждого изображения в списке. Я исправил свой первоначальный пост. Моя проблема с сохранением каждого нового изображения с измененным размером (локально или на Google Диске и т. Д.) Заключается в том, Что Они будут занимать много места. Тем не менее, это решение я готов протестировать на небольшой выборке изображений позже сегодня. Спасибо, и я буду держать вас в курсе.
Ответ №2:
вы отправляете весь image_list в cv2.resize, когда хотите отправлять только одно изображение за раз из списка.
for i in range(len(image_list)):
image_list[i] = cv2.resize(image_list[i], (200,200))
Комментарии:
1. Это на самом деле то, что у меня было с моей стороны, и это была опечатка. Я отредактировал свой первоначальный вопрос. Мои извинения. Есть ли у вас какие-либо идеи относительно того, как я могу сделать этот код более эффективным? Понимание списка было просто мыслью, но я открыт для всего.
2. @SpencerK Вы обнаружите
for
, что цикл так же эффективен, как и все остальное, понимание списка не ускорит его. Эффективность, которую вы ищете, будет заключаться в том, как вы создаете этот исходный image_list. Если вы можете разделить данные, например, на 500 изображений за раз, тогда ваша обработка должна стабилизироваться. Кроме того, вы можете убедиться, что вы не изменяете размер файлов дважды.