为什么在归一化互相关之前应用 rgb2gray 和归一化?

Why apply rgb2gray and normalize before normalized cross-correlation?

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);

问题一:为什么先在im和filter上做rgb2gray?

问题2:最后的第二行实际上是做什么的?即,

filter = filter/sqrt(sum(sum(filter.^2)));

问题一:为什么要先申请rgb2gray

normxcorr2 代表 "Normalized 2-D cross-correlation" 适用于 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) 自己做规范化,这一步绝对不需要。除非你除了与过滤器变量互相关之外不做其他事情,否则我会认为这是一个 应该删除的工件

函数的一般解释

此函数接收两个输入:一个图像文件和一个模板。 例如,图像文件可以是发现Waldo游戏的大场景,模板可以是Waldo本人的照片。 输出是一个名为 'out' 的矩阵,其大小与图像文件相同。 s.t。每个像素都有一个 "matching results"。值越高 - 以像素为中心的补丁拥有相似图案(例如模板)的可能性就越高。 最大值应该在 Waldo 所在的像素上。

问题 1

rgb2gray 函数接收一个 3 通道的 rgb 图像并将其转换为灰度图像。 它是在 im 和过滤器上完成的,因为 normxcorr2 函数仅适用于灰度图像。

问题二

最后执行模式的归一化:它将它除以它的范数,从而将它变为 1。实际上,这行不是必需的,应该删除。规范化阶段已在 normxcorr2 函数内执行。