Подтвердить что ты не робот

Как найти изображение, содержащееся в изображении?

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

Я пытаюсь найти способ поиска изображения, чтобы найти в нем символы.

Например:

cyanide and happiness

Предполагая, что у меня есть красный символ и зеленый символ, сохраненный как Красный Человек и Зеленый Человек, как определить, содержит ли изображение тот или другой.

Это не должно быть 100% -ным признанием или что-то еще, это больше добавленная функция, которую я бы хотел создать, я просто не знаю, с чего начать. Я много сделал для поиска изображений, но не нашел много полезного.

Для чего это стоит, я бы предпочел сделать это с помощью Python.

4b9b3361

Ответ 1

Для тех, кто сталкивается с этим в будущем.

Это можно сделать с помощью сопоставления с шаблоном. Подводя итог (мое понимание), сопоставление шаблонов ищет точное совпадение одного изображения в другом изображении.

Вот пример того, как сделать это в Python:

import cv2

method = cv2.TM_SQDIFF_NORMED

# Read the images from the file
small_image = cv2.imread('small_image.png')
large_image = cv2.imread('large_image.jpeg')

result = cv2.matchTemplate(small_image, large_image, method)

# We want the minimum squared difference
mn,_,mnLoc,_ = cv2.minMaxLoc(result)

# Draw the rectangle:
# Extract the coordinates of our best match
MPx,MPy = mnLoc

# Step 2: Get the size of the template. This is the same size as the match.
trows,tcols = small_image.shape[:2]

# Step 3: Draw the rectangle on large_image
cv2.rectangle(large_image, (MPx,MPy),(MPx+tcols,MPy+trows),(0,0,255),2)

# Display the original image with the rectangle around the match.
cv2.imshow('output',large_image)

# The image is only displayed if we call this
cv2.waitKey(0)

Ответ 2

Как Ответ Моше охватывает только соответствующий шаблон, который содержится только один раз на данном снимке. Здесь, как несколько совпадений:

import cv2
import numpy as np

img_rgb = cv2.imread('mario.png')
template = cv2.imread('mario_coin.png')
w, h = template.shape[:-1]

res = cv2.matchTemplate(img_rgb, template, cv2.TM_CCOEFF_NORMED)
threshold = .8
loc = np.where(res >= threshold)
for pt in zip(*loc[::-1]):  # Switch collumns and rows
    cv2.rectangle(img_rgb, pt, (pt[0] + w, pt[1] + h), (0, 0, 255), 2)

cv2.imwrite('result.png', img_rgb)

(Примечание: я изменил и исправил несколько "ошибок", которые были в исходном коде)

Результат:

определить монеты марио (до/после)

Источник: https://opencv-python-tutroals.readthedocs.org/en/latest/py_tutorials/py_imgproc/py_template_matching/py_template_matching.html

Ответ 3

OpenCV имеет интерфейс Python, на который вы можете смотреть. Если символы не меняются слишком сильно, вы можете попытаться использовать функцию matchTemplate.

Здесь является их официальное руководство по этому вопросу (учебник написан с использованием интерфейса С++, но вы должны иметь возможность получить представление о как использовать функцию в Python от него).

Ответ 4

Как я могу изменить его для поиска в нескольких файлах и экспорта имени файла также? Шаблон содержится только один раз на одной из предоставленных картинок