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

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

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

/ редактирование: хорошо, некоторые идеи: я использую PIL, и я преобразовываю каждое изображение в режим 'P', таким образом, я могу сравнить каждый пиксель как целое число. Я пытаюсь реализовать что-то как поиск строки Boyer–Moore или Knuth–Morris–Pratt алгоритм, но в 2 размерах.

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

ABC    
DEF    
GHI    

в

XXXXX        
XABCX        
XDEFX       
XGHIX    
XXXXX  

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

21
задан Zach 19 January 2011 в 13:12
поделиться

2 ответа

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

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 установите Pillow и из изображения импорта PIL

9
ответ дан 29 November 2019 в 21:47
поделиться

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

7
ответ дан 29 November 2019 в 21:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: