Вопрос или проблема
У меня есть изображение с нарисованным контуром. Как обрезать изображение вдоль нарисованной линии контура? Смотрите загруженное изображение
Я хочу использовать красный нож для бумаги, чтобы обрезать вдоль линии контура:
Я попытался использовать следующий скрипт для выполнения задачи, но результаты не соответствуют моим ожиданиям:
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'.")
Объяснение шагов:
-
Загрузка изображения: Загружаем изображение по указанному пути.
-
Преобразование в градации серого: Эта операция помогает упростить дальнейшую обработку.
-
Пороговая обработка: Создаётся бинарное изображение, где черные области представляют собой контуры.
-
Нахождение контуров: С помощью функции
cv2.findContours
получаем список контуров, которые затем можно обработать. -
Создание маски: Для каждого найденного контура создаём маску такого же размера, что и исходное изображение. Контур рисуется на маске белым цветом (255), а остальные области остаются чёрными (0).
-
Применение маски: Используем операцию «побитового И» для того, чтобы сохранять только те пиксели, которые соответствуют контуру.
-
Обрезка изображения: Используем
cv2.boundingRect()
, чтобы получить координаты ограничивающего прямоугольника вокруг контура. Затем обрезаем изображение по этим координатам. - Сохранение результата: Обрезанные изображения сохраняются в указанной директории.
Результат:
Запустив этот код, вы получите обрезанные изображения по контурам, которые находятся в папке cropped_images
. Если возникнут дополнительные вопросы или требуется дальнейшая помощь, не стесняйтесь обращаться!