首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >基于FFT的Matlab模板匹配

基于FFT的Matlab模板匹配
EN

Stack Overflow用户
提问于 2015-09-19 13:10:41
回答 1查看 12.5K关注 0票数 13

我正在努力在Matlab的傅立叶域中进行模板匹配。以下是我的图片(艺术家是DeviantArt上的RamalamaCreatures ):

我的目标是在负鼠的耳朵周围放置一个边界框,如下面的示例(我使用normxcorr2执行模板匹配):

下面是我使用的Matlab代码:

代码语言:javascript
运行
复制
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);

代码没有按预期运行-它没有识别正确的区域。这是失败的结果--框住了错误的区域:

这是失败匹配的相关性的曲面图:

希望你能帮上忙!谢谢。

EN

回答 1

Stack Overflow用户

发布于 2020-05-25 02:35:21

我最终用python实现了相同的功能,与@rayryeng使用scipy.fftpack.fftn() / ifftn()函数的想法类似,在相同的目标和模板图像上得到了以下结果:

代码语言:javascript
运行
复制
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()

此外,下面的动画显示了在一组(目标)帧中定位鸟的模板图像时获得的结果,该帧是从一段包含一群鸟的视频中提取的。

需要注意的一点是:输出在很大程度上取决于要与模板匹配的对象的大小和形状的相似性,如果它与模板图像的大小和形状有很大不同,则模板可能根本不匹配。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32664481

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档