Как найти изображение в другом изображении с помощью python
Я пытаюсь использовать python, чтобы определить, находится ли одно (маленькое) изображение в другом (большом) изображении.
Любые предложения, прежде чем я полностью опустится на неправильный путь?
/edit: Хорошо, некоторые идеи: я использую PIL, и я конвертирую каждое изображение в режим "P", чтобы сравнить каждый пиксель как целое число. Я пытаюсь реализовать что-то вроде строкового поиска Boyer-Moore или алгоритма Кнута-Морриса-Пратта, но в двух измерениях.
Возможно, это поможет: вместо поиска ABC in XXXABCXXX
(answer = 4) мы ищем
ABC
DEF
GHI
в
XXXXX
XABCX
XDEFX
XGHIX
XXXXX
(ответ = (2,2))
Ответы
Ответ 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)
.