Как преобразовать этот цикл for в понимание списка Python?

#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))]
  
  1. Какие изменения я должен внести во второй блок кода?
  2. Является ли преобразование первого блока кода (цикла 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 изображений за раз, тогда ваша обработка должна стабилизироваться. Кроме того, вы можете убедиться, что вы не изменяете размер файлов дважды.