我正在努力在Matlab的傅立叶域中进行模板匹配。以下是我的图片(艺术家是DeviantArt上的RamalamaCreatures ):
我的目标是在负鼠的耳朵周围放置一个边界框,如下面的示例(我使用normxcorr2执行模板匹配):
下面是我使用的Matlab代码:
clear all; close all;
template = rgb2gray(imread('possum_ear.jpg'));
background = rgb2gray(imread('possum.jpg'));
%% calculate padding
bx = size(background, 2);
by = size(background, 1);
tx = size(template, 2); % used for bbox placement
ty = size(template, 1);
%% fft
c = real(ifft2(fft2(background) .* fft2(template, by, bx)));
%% find peak correlation
[max_c, imax] = max(abs(c(:)));
[ypeak, xpeak] = find(c == max(c(:)));
figure; surf(c), shading flat; % plot correlation
%% display best match
hFig = figure;
hAx = axes;
position = [xpeak(1)-tx, ypeak(1)-ty, tx, ty];
imshow(background, 'Parent', hAx);
imrect(hAx, position);
代码没有按预期运行-它没有识别正确的区域。这是失败的结果--框住了错误的区域:
这是失败匹配的相关性的曲面图:
希望你能帮上忙!谢谢。
发布于 2020-05-25 02:35:21
我最终用python实现了相同的功能,与@rayryeng使用scipy.fftpack.fftn() / ifftn()
函数的想法类似,在相同的目标和模板图像上得到了以下结果:
import numpy as np
import scipy.fftpack as fp
from skimage.io import imread
from skimage.color import rgb2gray, gray2rgb
import matplotlib.pylab as plt
from skimage.draw import rectangle_perimeter
im = 255*rgb2gray(imread('http://i.stack.imgur.com/FXEy7.jpg')) # target
im_tm = 255*rgb2gray(imread('http://i.stack.imgur.com/6bTzT.jpg')) # template
# FFT
F = fp.fftn(im)
F_tm = fp.fftn(im_tm, shape=im.shape)
# compute the best match location
F_cc = F * np.conj(F_tm)
c = (fp.ifftn(F_cc/np.abs(F_cc))).real
i, j = np.unravel_index(c.argmax(), c.shape)
print(i, j)
# 214 317
# draw rectangle around the best match location
im2 = (gray2rgb(im)).astype(np.uint8)
rr, cc = rectangle_perimeter((i,j), end=(i + im_tm.shape[0], j + im_tm.shape[1]), shape=im.shape)
for x in range(-2,2):
for y in range(-2,2):
im2[rr + x, cc + y] = (255,0,0)
# show the output image
plt.figure(figsize=(10,10))
plt.imshow(im2)
plt.axis('off')
plt.show()
此外,下面的动画显示了在一组(目标)帧中定位鸟的模板图像时获得的结果,该帧是从一段包含一群鸟的视频中提取的。
需要注意的一点是:输出在很大程度上取决于要与模板匹配的对象的大小和形状的相似性,如果它与模板图像的大小和形状有很大不同,则模板可能根本不匹配。
https://stackoverflow.com/questions/32664481
复制相似问题