Как определить логотип, если он искажен?

Как обнаружить логотипы, если они искажены (то есть растянуты, свернуты, сжаты)?

Я использовал SIFT как функции для обнаружения, так как он масштабирован инвариантно.

Ниже приведен пример, логотип появляется на бутылке, он вытянут вдоль кривизны бутылки.

Кроме того, материал продукта также повлияет на результат, например, он может отражать свет.

Как решить эти две проблемы? Я был бы признателен, если бы кто-то мог дать мне подробную информацию, спасибо!

Логотип:

Пример:

2 ответа

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

import cv2
import numpy as np

src = np.array([[8,125], [68,30], [576,261], [510,396]], np.float32)
dst = np.array([[0,0], [100, 0], [100, 400], [0, 400]], np.float32)
perspective_transform = cv2.getPerspectiveTransform(src, dst)
img = cv2.imread('d:\\temp\\logo_lamer.png')
final_img = cv2.warpPerspective(img, perspective_transform, (100, 400))
cv2.imwrite('d:\\temp\\logo_lamer2.png', final_img)

Точки жестко закодированы, но найти их не должно быть очень сложно - я просто использовал самые левые, самые верхние, самые правые и самые нижние точки бутылки. Вот изображение с точками:

и вот результат преобразования:

Как вы можете видеть, он не идеален (буквы "L" и "R" видны не полностью), но его можно улучшить, используя некоторые хорошие объекты для извлечения объектов. Использование grabcut может быть хорошей идеей, но, скорее всего, многие методы будут хорошо работать в этой ситуации. В качестве альтернативы, после нахождения точек вы можете попытаться просто убедиться, что они образуют (повернутый) прямоугольник, поэтому убедитесь, что все углы равны (или близки) к 90 градусам - вот как вы можете это сделать.

Теперь должно быть намного проще применить какую-то технику из этого qeuration (я бы попробовал методы scanline и sift/surf, но это только мое предположение). В качестве альтернативы вы можете попытаться использовать обобщенное грубое преобразование (GHT), сопоставление с шаблоном или обучить свой собственный классификатор с использованием Haar-подобных функций, LBP(локальные двоичные шаблоны) или HOG.

В своем вопросе вы говорите, что используете SIFT. Результаты не достаточно хороши?

Используя детектор и дескриптор SIFT, я получил следующие результаты:

SIFT соответствие результата

Не достаточно хорош?

Другие вопросы по тегам