Как найти изображение в другом изображении, используя python - PullRequest
21 голосов
/ 16 июня 2010

Я пытаюсь использовать python, чтобы определить, находится ли одно (маленькое) изображение в другом (большом) изображении.

Есть какие-нибудь предложения, прежде чем я пойду совершенно по неверному пути?

/ edit: Хорошо, некоторые идеи: я использую PIL, и я конвертирую каждое изображение в 'P'режим, чтобы я мог сравнить каждый пиксель как целое число.Я пытаюсь реализовать что-то вроде поиска строки Бойера-Мура или алгоритма Кнута-Морриса-Пратта, но в двух измерениях.

Может быть, это поможет: вместо поиска ABC in XXXABCXXX (answer = 4) мы ищем

ABC    
DEF    
GHI    

в

XXXXX        
XABCX        
XDEFX       
XGHIX    
XXXXX  

(ответ = (2,2))

Ответы [ 5 ]

9 голосов
/ 16 июня 2010

РЕДАКТИРОВАТЬ: Хорошо, вот наивный способ сделать это:

import Image, numpy

def subimg(img1,img2):
    img1=numpy.asarray(img1)
    img2=numpy.asarray(img2)

    #img1=numpy.array([[1,2,3],[4,5,6],[7,8,9]])
    #img2=numpy.array([[0,0,0,0,0],[0,1,2,3,0],[0,4,5,6,0],[0,7,8,9,0],[0,0,0,0,0]])

    img1y=img1.shape[0]
    img1x=img1.shape[1]

    img2y=img2.shape[0]
    img2x=img2.shape[1]

    stopy=img2y-img1y+1
    stopx=img2x-img1x+1

    for x1 in range(0,stopx):
        for y1 in range(0,stopy):
            x2=x1+img1x
            y2=y1+img1y

            pic=img2[y1:y2,x1:x2]
            test=pic==img1

            if test.all():
                return x1, y1

    return False

small=Image.open('small.tif')
big=Image.open('big.tif')

print subimg(small, big)

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

Редактировать 2: убедитесь, что вы используете изображения в формате без потерь, чтобы проверить это.

Вкл. Mac, установите подушку и from PIL import Image

7 голосов
/ 16 июня 2010

Sikuli делает это с помощью OpenCV, см. здесь как работает match_by_template, а затем используйте привязки Python OpenCV для того же.Делать это без OpenCV должно быть сложно, взгляните на документацию OpenCV, найдите соответствующий шаблон и т. Д ...

3 голосов
/ 25 января 2019
Модуль

pyautogui выполняет работу, используя метод pyautogui.locate(small_image, large_image), который возвращает четырехзначный кортеж: (left, top, width, height).

3 голосов
/ 26 сентября 2011

Я знаю, что уже немного поздно, но вы можете использовать Бойера-Мура для поиска первой строки маленького изображения в каждой из строк большого изображения. В тот момент, когда вы находите совпадение, у вас есть позиции X и Y, и вам просто нужно проверить, соответствуют ли остальные строки меньшего изображения остальным линиям большего изображения, начиная с позиций X и Y + 1,2, 3, ... При первом несовпадении продолжить поиск по первой строке. Я не думаю, что вы можете получить быстрее, чем это.

0 голосов
/ 13 февраля 2012

Посмотрите на мой ответ на аналогичный вопрос для примера кода с использованием OpenCV . Преобразование из PIL в NumPy является прямым, например, просто используйте np.array(pilimage).

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