Я пытаюсь реализовать сопоставление шаблонов с помощью FFT Convolution в Python. У меня есть исходное изображение S и шаблонное изображение T, и я пытаюсь найти положение шаблона T на изображении S.
import numpy as np
from scipy import signal
from PIL import Image
from copy import deepcopy
import math
original_image = "Test3/public/set/map.png"
segment = "Test3/public/set/0/0.png"
arrMain = Image.open(original_image, 'r').convert('L') #converting my image to grayscale
openCVimMain = np.asarray(arrMain) #2D pixel array of main image
arrSegment = Image.open(segment, 'r').convert('L')
openCVSegment = np.asarray(openCVSegment) #2D pixel array of templateImage
arr = signal.fftconvolve(openCVimMain, openCVSegment, mode='valid')
ind = np.unravel_index(np.argmax(arr, axis=None), arr.shape) #looking for index in matrix with highest coorelation value.
print(ind)
Предыдущий код выдает случайное решение, даже близко не подходящее.
Мой код работает для маленьких матриц. Например:
a = np.array([[1,2,3],[4,5,6],[7,8,9]])
b = np.array([[5,6],[8,9]])
sol = signal.fftconvolve(a, b, mode='valid')
sol
>>array([[ 74., 102.],
[158., 186.]])
И шаблон наилучшего соответствия здесь находится в позиции (2,2), что является правильным. Почему это не работает для изображений в градациях серого?
Я проверил здесь: Соответствие шаблона с использованием FFT