Как мне найти изображение, содержащееся в изображении? - PullRequest
22 голосов
/ 21 октября 2011

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

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

Например:

cyanide and happiness

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

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

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

Ответы [ 3 ]

29 голосов
/ 01 марта 2013

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

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

Вот пример того, как сделать это в 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)
21 голосов
/ 13 февраля 2016

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

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)

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

Результат:

detect mario coins (before/after)

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

1 голос
/ 22 октября 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...