Распознавание круглых и треугольных печатей на python
Распознавание и классификация печатей на изображениях имеет широкий спектр применений, от автоматизации процессов до обеспечения безопасности. В данной статье мы рассмотрим методы обнаружения круглых и треугольных печатей с использованием алгоритмов обработки изображений и компьютерного зрения.
Значение распознавания печатей
Печати являются важными элементами в различных областях, таких как документооборот, банковское дело, медицина и другие. Точное распознавание и классификация печатей на изображениях позволяют автоматизировать процессы и повысить эффективность работы.
Методы распознавания
В статье мы рассмотрим применение алгоритмов обработки изображений для обнаружения круглых и треугольных форм, а также методы классификации, которые могут быть использованы для их дальнейшей идентификации.
Бейзлайн с использованием OpenCV
Для определения круглых печатей на изображении можно использовать алгоритм Хафа, а для определения треугольных форм - алгоритмы аппроксимации контуров. Обработка изображений с использованием Python и библиотеки OpenCV позволяет эффективно находить и выделять как круглые, так и треугольные формы на изображениях.
Вот пример кода на Python, который использует библиотеку OpenCV для определения как круглых, так и треугольных печатей на изображении:
import cv2
import numpy as np
# Считывание изображения
image = cv2.imread('your_image.jpg')
# Преобразование изображения в оттенки серого
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# Применение алгоритма Кэнни для обнаружения границ
edges = cv2.Canny(gray, 50, 150, apertureSize=3)
# Поиск контуров на изображении
contours, _ = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# Переменные для подсчета количества круглых и треугольных печатей
circle_count = 0
triangle_count = 0
# Поиск круглых и треугольных форм среди контуров
for contour in contours:
# Поиск круглых форм
(x, y), radius = cv2.minEnclosingCircle(contour)
center = (int(x), int(y))
radius = int(radius)
cv2.circle(image, center, radius, (0, 255, 0), 2)
circle_count += 1
# Поиск треугольных форм
approx = cv2.approxPolyDP(contour, 0.04 * cv2.arcLength(contour, True), True)
if len(approx) == 3:
cv2.drawContours(image, [contour], 0, (0, 0, 255), 2)
triangle_count += 1
# Вывод количества найденных круглых и треугольных печатей
print("Количество найденных круглых печатей:", circle_count)
print("Количество найденных треугольных печатей:", triangle_count)
# Отображение изображения с найденными круглыми и треугольными формами
cv2.imshow('Shapes Detected', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
Этот пример кода демонстрирует использование OpenCV для определения как круглых, так и треугольных форм на изображении. Обратите внимание, что параметры алгоритма Кэнни (Canny) и метода аппроксимации контуров (approxPolyDP) могут потребовать настройки в зависимости от конкретных требований задачи.
Как улучшить распознавание?
Для улучшения точности распознавания печатей можно внести следующие изменения в ваш код:
- Применить размытие Гаусса перед применением алгоритма Кэнни. Это поможет уменьшить шум на изображении.
- Использовать функцию
cv2.HoughCircles
для более точного обнаружения круглых форм. - Использовать более строгий критерий для определения треугольников, проверяя углы между вершинами.
Вот обновленный код:
import cv2
import numpy as np
# Считывание изображения
image = cv2.imread('your_image.jpg')
# Преобразование изображения в оттенки серого
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# Применение размытия Гаусса
blurred = cv2.GaussianBlur(gray, (5, 5), 0)
# Применение алгоритма Кэнни для обнаружения границ
edges = cv2.Canny(blurred, 50, 150, apertureSize=3)
# Поиск контуров на изображении
contours, _ = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# Переменные для подсчета количества круглых и треугольных печатей
circle_count = 0
triangle_count = 0
# Поиск круглых форм
circles = cv2.HoughCircles(blurred, cv2.HOUGH_GRADIENT, 1.2, 100)
if circles is not None:
circles = np.round(circles[0, :]).astype("int")
for (x, y, r) in circles:
cv2.circle(image, (x, y), r, (0, 255, 0), 4)
circle_count += 1
# Поиск треугольных форм среди контуров
for contour in contours:
approx = cv2.approxPolyDP(contour, 0.04 * cv2.arcLength(contour, True), True)
if len(approx) == 3:
# Проверка углов между вершинами
a = np.linalg.norm(approx[0] - approx[1])
b = np.linalg.norm(approx[1] - approx[2])
c = np.linalg.norm(approx[2] - approx[0])
angle = np.arccos((b**2 + c**2 - a**2)/(2*b*c))
if np.abs(angle - np.pi/3) < 0.1:
cv2.drawContours(image, [contour], 0, (0, 0, 255), 2)
triangle_count += 1
# Вывод количества найденных круглых и треугольных печатей
print("Количество найденных круглых печатей:", circle_count)
print("Количество найденных треугольных печатей:", triangle_count)
# Отображение изображения с найденными круглыми и треугольными формами
cv2.imshow('Shapes Detected', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
Обратите внимание, что параметры функций GaussianBlur
, Canny
, HoughCircles
и approxPolyDP
могут потребовать настройки в зависимости от конкретных требований задачи и качества изображения.