Как обрезать изображение по контурной линии, нарисованной с помощью OpenCV?

Вопрос или проблема

У меня есть изображение с нарисованным контуром. Как обрезать изображение вдоль нарисованной линии контура? Смотрите загруженное изображение
введите описание изображения здесь

Я хочу использовать красный нож для бумаги, чтобы обрезать вдоль линии контура:введите описание изображения здесь

Я попытался использовать следующий скрипт для выполнения задачи, но результаты не соответствуют моим ожиданиям:

import cv2
import numpy as np
import os

# Загружаем изображение
image_path="cropped_drawcontourtest.png"  # Измените путь к вашему изображению
image = cv2.imread(image_path)

# Преобразуем в оттенки серого
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# Применяем пороговую обработку для получения бинарного изображения
_, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY_INV)

# Находим контуры
contours, _ = cv2.findContours(binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

# Создаем каталог для обрезанных изображений, если он не существует
output_dir="cropped_images"
os.makedirs(output_dir, exist_ok=True)

# Обрезаем по контурам и сохраняем
for i, contour in enumerate(contours):
    # Создаем маску для текущего контура
    mask = np.zeros_like(image)
    cv2.drawContours(mask, [contour], -1, (255, 255, 255), thickness=cv2.FILLED)

    # Применяем маску к оригинальному изображению
    cropped = cv2.bitwise_and(image, mask)

    # Сохраняем обрезанное изображение
    cv2.imwrite(os.path.join(output_dir, f'cropped_{i}.png'), cropped)

print("Обрезка завершена! Проверьте каталог 'cropped_images'.")

используйте cv2.boundingRect(), чтобы получить координаты линии, а затем используйте эти координаты для обрезки изображения.

x, y, w, h = cv2.boundingRect(contour)

Ответ или решение

Чтобы обрезать изображение вдоль контура, нарисованного с помощью OpenCV, можно использовать несколько шагов, включая подготовку изображения, нахождение контуров и создание маски для обрезки. Ниже представлен полный код на Python с объяснением каждого шага:

import cv2
import numpy as np
import os

# Загрузка изображения
image_path = "cropped_drawcontourtest.png"  # Укажите путь к вашему изображению
image = cv2.imread(image_path)

# Преобразование в градации серого
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# Применение пороговой обработки для получения бинарного изображения
_, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY_INV)

# Нахождение контуров
contours, _ = cv2.findContours(binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

# Создание директории для обрезанных изображений, если она не существует
output_dir = "cropped_images"
os.makedirs(output_dir, exist_ok=True)

# Обрезка вдоль контуров и сохранение
for i, contour in enumerate(contours):
    # Создание маски для текущего контура
    mask = np.zeros_like(image)
    cv2.drawContours(mask, [contour], -1, (255, 255, 255), thickness=cv2.FILLED)

    # Применение маски к оригинальному изображению
    cropped = cv2.bitwise_and(image, mask)

    # Получение прямоугольной области, в которую вписан контур
    x, y, w, h = cv2.boundingRect(contour)

    # Обрезка изображения по области, определенной boundingRect
    cropped_image = cropped[y:y+h, x:x+w]

    # Сохранение обрезанного изображения
    cv2.imwrite(os.path.join(output_dir, f'cropped_{i}.png'), cropped_image)

print("Обрезка завершена! Проверьте директорию 'cropped_images'.")

Объяснение шагов:

  1. Загрузка изображения: Загружаем изображение по указанному пути.

  2. Преобразование в градации серого: Эта операция помогает упростить дальнейшую обработку.

  3. Пороговая обработка: Создаётся бинарное изображение, где черные области представляют собой контуры.

  4. Нахождение контуров: С помощью функции cv2.findContours получаем список контуров, которые затем можно обработать.

  5. Создание маски: Для каждого найденного контура создаём маску такого же размера, что и исходное изображение. Контур рисуется на маске белым цветом (255), а остальные области остаются чёрными (0).

  6. Применение маски: Используем операцию «побитового И» для того, чтобы сохранять только те пиксели, которые соответствуют контуру.

  7. Обрезка изображения: Используем cv2.boundingRect(), чтобы получить координаты ограничивающего прямоугольника вокруг контура. Затем обрезаем изображение по этим координатам.

  8. Сохранение результата: Обрезанные изображения сохраняются в указанной директории.

Результат:

Запустив этот код, вы получите обрезанные изображения по контурам, которые находятся в папке cropped_images. Если возникнут дополнительные вопросы или требуется дальнейшая помощь, не стесняйтесь обращаться!

Оцените материал
Добавить комментарий

Капча загружается...