Обработка изображений, как определить конкретную c пользовательскую форму в изображении - PullRequest
2 голосов
/ 14 марта 2020

Я хочу определить конкретную c форму, которая является комбинацией двух фигур Пентагона и квадрата. Однако сторона квадрата должна быть примерно в 3 раза больше пятиугольника, чтобы соответствовать правильной форме, как показано на рисунке.

enter image description here

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

  1. Обнаружение контура: проблема в том, что недостаточно 7 углов, так как требуется проверка x: 3x.

  2. Особенности Haar: Проблема в том, что изображения состоят из фона, и внутри этих объектов есть текст. Так что, по моему мнению, haar не будет оптимальным методом.

Моя идея

Я думаю, что, может быть, я могу обнаружить углы линий и, используя длины сторон, я могу сделать некоторую математику и определить изображение. Есть ли какая-либо техника обработки изображений, которая использует математическое расстояние, масштаб, местоположение для идентификации объекта?

Исходное изображение

соответствует

enter image description here

не соответствует

enter image description here

1 Ответ

1 голос
/ 14 марта 2020

Вот простой подход:

  1. Получение двоичного изображения. Загрузка изображения, преобразование в оттенки серого, Размытие по Гауссу , затем Порог Оцу .

  2. Фильтр для требуемого контура. Мы находим контуры , затем фильтруем, используя комбинацию аппроксимация контура + контурная область . С учетом того, что формы имеют большую разность площадей, мы можем использовать предварительно определенную пороговую область для идентификации между ними.


Ввод -> Двоичное изображение -> Обнаруженная форма

image image image

Результат

Match

Ввод -> Двоичное изображение -> Обнаруженная форма

image image image

Результат

No Match

С вы не указали язык, я реализовал в Python

import cv2
import numpy as np

# Load image, grayscale, Gaussian blur, Otsus threshold
image = cv2.imread('1.png')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
blur = cv2.GaussianBlur(gray, (3,3), 0)
thresh = cv2.threshold(blur, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1]

# Find contours
cnts = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
for c in cnts:
    peri = cv2.arcLength(c, True)
    approx = cv2.approxPolyDP(c, 0.04 * peri, True)
    area = cv2.contourArea(c)
    # Filter using contour approximation and area filtering (Remove small noise)
    if len(approx) > 4 and len(approx) < 8 and area > 200:
        # This is the larger version
        if area >= 5500:
            print('Match')
        # Smaller version
        elif area < 5500:
            print('No Match')
        cv2.drawContours(image, [c], -1, (255,0,12), 3)

cv2.imshow('thresh', thresh)
cv2.imshow('image', image)
cv2.waitKey()     
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...