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

Как найти изображение в другом изображении с помощью python

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

Любые предложения, прежде чем я полностью опустится на неправильный путь?

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

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

ABC    
DEF    
GHI    

в

XXXXX        
XABCX        
XDEFX       
XGHIX    
XXXXX  

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

4b9b3361

Ответ 1

EDIT: Хорошо, вот наивный способ сделать это:

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)

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

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

В Mac установите Pillow и from PIL import Image

Ответ 2

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

Ответ 3

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

Ответ 4

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

Ответ 5

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