Я пытаюсь использовать Python, чтобы определить, ли одно (маленькое) изображение в рамках другого (большого) изображения.
Какие-либо предложения, прежде чем я возьму меня полностью вниз неправильный путь?
/ редактирование: хорошо, некоторые идеи: я использую PIL, и я преобразовываю каждое изображение в режим 'P', таким образом, я могу сравнить каждый пиксель как целое число. Я пытаюсь реализовать что-то как поиск строки Boyer–Moore или Knuth–Morris–Pratt алгоритм, но в 2 размерах.
Возможно, это поможет: вместо поиска ABC in XXXABCXXX
(answer=4) мы ищем
ABC
DEF
GHI
в
XXXXX
XABCX
XDEFX
XGHIX
XXXXX
(ответьте = (2,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
Sikuli делает это с помощью OpenCV, см. здесь , как работает match_by_template
, а затем используйте привязки Python OpenCV, чтобы сделать то же самое. Сделать это без OpenCV должно быть сложно, взгляните на документацию OpenCV, найдите соответствие шаблону и т. Д.