Контуры — важное понятие в обработке изображений и компьютерном зрении. Это границы или очертания объектов, присутствующих на изображении. OpenCV, популярная библиотека компьютерного зрения, предоставляет различные методы эффективного извлечения контуров из изображений. В этой статье блога мы рассмотрим несколько методов извлечения контуров с помощью OpenCV, а также приведем примеры кода.
Методы извлечения контуров:
- Пороговое значение.
Пороговое значение — это широко используемый метод преобразования изображений в оттенках серого в двоичные изображения. Он упрощает изображение, преобразуя все пиксели выше или ниже определенного порогового значения в белые или черные соответственно. Применяя пороговое значение и используя функцию OpenCVfindContours()
, мы можем легко извлечь контуры. Вот пример фрагмента кода:
import cv2
image = cv2.imread('image.jpg')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
_, threshold = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
contours, _ = cv2.findContours(threshold, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
- Обнаружение канни-края.
Обнаружение канни-края — это метод, который идентифицирует края на изображении. Его часто используют в качестве этапа предварительной обработки перед извлечением контура. Для этой цели OpenCV предоставляет функциюCanny()
. Вот пример:
import cv2
image = cv2.imread('image.jpg')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray, 100, 200)
contours, _ = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
- Морфологические операции.
Морфологические операции, такие как расширение и эрозия, могут усиливать или подавлять определенные особенности изображения. Они полезны для очистки зашумленных контуров или заполнения пробелов. Вот пример использования морфологических операций для выделения контуров:
import cv2
import numpy as np
image = cv2.imread('image.jpg')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
_, threshold = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
kernel = np.ones((5, 5), np.uint8)
dilated = cv2.dilate(threshold, kernel, iterations=1)
contours, _ = cv2.findContours(dilated, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
- Методы аппроксимации.
OpenCV предоставляет несколько методов для аппроксимации контуров и уменьшения количества точек, необходимых для представления контура. Это может быть полезно для уменьшения использования памяти или упрощения сложных контуров. Вот пример использования алгоритма Дугласа-Пейкера:
import cv2
image = cv2.imread('image.jpg')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
_, threshold = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
contours, _ = cv2.findContours(threshold, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
epsilon = 0.01 * cv2.arcLength(contours[0], True)
approx = cv2.approxPolyDP(contours[0], epsilon, True)
В этой статье мы рассмотрели различные методы извлечения контуров с помощью OpenCV. Мы рассмотрели такие методы, как определение порога, обнаружение границ Кэнни, морфологические операции и аппроксимация контура. Используя эти методы, вы можете эффективно извлекать контуры из изображений для дальнейшего анализа или задач компьютерного зрения.