Распознавание круглых и треугольных печатей на 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) могут потребовать настройки в зависимости от конкретных требований задачи.

Как улучшить распознавание?

Для улучшения точности распознавания печатей можно внести следующие изменения в ваш код:

  1. Применить размытие Гаусса перед применением алгоритма Кэнни. Это поможет уменьшить шум на изображении.
  2. Использовать функцию cv2.HoughCircles для более точного обнаружения круглых форм.
  3. Использовать более строгий критерий для определения треугольников, проверяя углы между вершинами.

Вот обновленный код:

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 могут потребовать настройки в зависимости от конкретных требований задачи и качества изображения.