Как сохранять маски в формате npz, полученные с помощью контуров из OpenCV?

Здравствуйте! У меня есть код, который использует библиотеку cv2 для рисования контуров на изображении. В частности, я использую следующую строку:

<pre><code class="python">cv2.drawContours(combined_image_2, all_contours, -1, (0, 255, 0), object_size[0] // 40)</code></pre>

где переменная all_contours содержит контуры. Затем я добавляю эту переменную в общий список fin_mask. Учитывая, что изображений может быть много, как я могу быстро и эффективно решить эту задачу, минимизировав использование оперативной памяти? В результате мне нужен один файл в формате npz. 

Буду признателен за пример кода!
  • 29 августа 2024 г. 17:44
Ответы на вопрос 1
Здравствуйте! Чтобы сохранить маски, полученные с помощью контуров из OpenCV, в формате NPZ и минимизировать использование оперативной памяти, вы можете использовать библиотеку NumPy для создания массивов масок и сохранения их в файл NPZ. 

Вот как это можно сделать:

1. Сначала создайте маски для каждого изображения с контурами и добавьте их в список.
2. Далее, преобразуйте список масок в массив NumPy.
3. Затем сохраните этот массив в формате NPZ.

Вот пример кода, который демонстрирует этот процесс:

```python
import cv2
import numpy as np

# Пример: список изображений и их размеров
image_files = ['image1.png', 'image2.png', 'image3.png']
combined_image_height, combined_image_width = 1000, 1000  # Предположим, размеры ваших изображений
fin_mask = []  # Список для хранения масок

for image_file in image_files:
    # Загрузите изображение
    image = cv2.imread(image_file)
    
    # Обработка изображения и получение контуров
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
    contours, _ = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

    # Создайте пустую маску для текущего изображения
    mask = np.zeros((combined_image_height, combined_image_width), dtype=np.uint8)
    
    # Нарисуйте контуры на маске
    cv2.drawContours(mask, contours, -1, (255), thickness=cv2.FILLED)
    
    # Добавьте маску в список
    fin_mask.append(mask)

# Преобразуйте список масок в массив NumPy
fin_mask_array = np.array(fin_mask)

# Сохраните маски в формате NPZ
np.savez_compressed('masks.npz', masks=fin_mask_array)

print("Маски успешно сохранены в файл masks.npz.")
```

### Пояснение кода:
1. **Загрузка и обработка изображений**: Изображения загружаются с помощью `cv2.imread`, после чего получаются контуры.
2. **Создание масок**: Для каждого изображения создается пустая маска и на нее рисуются контуры.
3. **Сохранение**: Все маски объединяются в массив NumPy и сохраняются в файл формата NPZ, используя `np.savez_compressed`, что позволяет сжать данные и сэкономить место.

Таким образом, вы получите один файл `masks.npz`, содержащий все ваши маски, и минимизируете использование оперативной памяти.
Похожие вопросы