function out = findWaldo(im, filter)
% convert image (and filter) to grayscale
im_input = im;
im = rgb2gray(im);
im = double(im);
filter = rgb2gray(filter);
filter = double(filter);
filter = filter/sqrt(sum(sum(filter.^2)));
out = normxcorr2(filter, im);
问题1:为什么我们首先对im进行rgb2gray过滤?
问题2:最后一行实际上做了什么?即,
filter = filter/sqrt(sum(sum(filter.^2)));
答案 0 :(得分:1)
问题1:为什么先申请rgb2gray
?
normxcorr2
代表"归一化的2-D互相关"适用于2D信号(参见doc)。 RGB图像是3D信号:width x height x color
(例如1024 x 1024 x 3
,3,因为它是三种颜色)。这就是为什么你先把它压平成一个颜色通道。将滤镜分别应用于每种颜色的图像将是另一种选择,但是您还需要处理三种相关性(平均它们或其他......)。
问题2: filter = filter/sqrt(sum(sum(filter.^2)));
做什么?
它对滤镜图像进行平方,然后对行和列进行求和(基本上是滤镜的所有平方灰度值),以获得应用平方根的单个数字,然后用于划分所有滤镜图像值。
我说这是处理特定输入信号的某种规范化,可能是尝试从0 - 1获取值。但是因为规范化交叉相关(normxcorr2
)本身是否正常化,这一步绝对不需要。除非您不做与过滤器变量互相关的操作,否则我认为这是应该删除的工件。
答案 1 :(得分:1)
功能的一般说明
此功能接收两个输入:图像文件和模板。 例如,图像文件可能是Waldo游戏发现的大型场景,模板可以是Waldo自己的照片。 输出是一个名为'out'的矩阵,其大小与图像文件相同。 S.T.每个像素保持“匹配结果”。值越高 - 以像素为中心的补丁保持类似模式(如模板)的可能性越大。 最大值应该在Waldo所在的像素上。
问题1
rgb2gray函数接收带有3个通道的rgb图像并将其转换为灰色图像。 它在im和on滤镜上完成,因为normxcorr2功能仅适用于灰度图像。
问题2
最后一次执行模式的规范化:它将它除以它的范数,从而将其改为1. 实际上,这一行不是必需的,应该删除。规范化阶段已在normxcorr2函数内执行。