我想知道是否有人可以帮助解释在进行模板匹配时如何使用蒙版。具体来说,我试图在MATLAB中做到这一点,但如果有人可以解释逻辑,我可以想出自己实现它。我尝试了多次互联网搜索,但却未能找到明确的答案。
在下面这个帖子的回答中,面具从来没有被定义过,我也找不到任何可以解释如何合并它的人,所以我想我应该从一个更普遍的角度来试试这个问题。我可以从那里弄明白。
Matching object outer shape using normalized cross correlation
感谢您的帮助
答案 0 :(得分:1)
你提到的那篇帖子我提供了一个答案,虽然它不是公认的答案。我很惊讶我没看到你之前发布的帖子,我为此深表歉意。
通常情况下,当您进行模板匹配时,您可以使用模板中所有像素,并希望使用此模板搜索匹配的图像。在该帖子中,OP有一个模板,但只想在模板中包含某些像素。模板是一个矩形区域,里面有东西......无论是灰度强度,颜色像素等,都代表了你在匹配图像中试图找到的东西。
在该帖子中,此区域中的所有像素都不会包含在模板中。具体来说,只指定模板中某些的像素应该是相关匹配的一部分。要包含在模板中的这些像素由掩码指定,这是您在帖子中寻找的内容。您所指的那篇文章的OP想要找到一个圆形对象,忽略实际圆圈内部的内容。
因此,在模板内部,他们使用掩码来提取应该成为相关匹配一部分的像素。通常,您将对模板中的所有像素进行归一化互相关,并在匹配图像中使用相同大小区域中的所有像素。对于您在模板内部引用的帖子,掩码指定哪些像素应该是匹配的一部分。任何白色的都是应该包含在匹配中的像素,而任何黑色都应该被忽略。
如果在这种情况下查看OP帖子中的遮罩,它只会查找圆形对象本身,而忽略圆形对象内的那些像素。圆形对象内的内容并不重要。他们只想检测一般的圆形。如果要将这些像素作为模板的一部分包含在对象内部,则可能由于对象中包含的某些噪声而无法找到圆形对象。
您无法在主题上找到任何内容的原因是因为模板匹配很少忽略模板中的像素。您希望尽可能多地使用信息,以便尝试使匹配更加健壮。您引用的那篇文章是针对OP应用程序的特殊情况。
现在,我了解您的真实情况,您想要以编程方式定义掩码。特别是,您要定义在您引用的帖子中看到的圆形蒙版。在MATLAB中编写代码非常简单。你看到的那个圆环有两个半径:内圈和外圈。你要做的是计算从该图像中心到掩模中每个点的欧几里德距离。对于内圈半径为>=
且对外圈半径为<=
的点将设置为true
,而其他任何设置为false
。因此,一般步骤是:
(0,0)
是图像的中心。使用meshgrid
为您执行此操作。>=
内环半径和<=
外环半径。如果是,请将其设置为true
,否则设置为false
。 因此:
%// Dimensions of image
%// Change here accordingly
rows = 101;
cols = 101;
%// Radii - Change accordingly
%// Inner ring radius
inner_radius = 20;
%// Outer ring radius
outer_radius = 40;
%// Define grid of points
[X,Y] = meshgrid(-floor(cols/2):floor(cols/2), -floor(rows/2):floor(rows/2));
%// Find Euclidean distance with respect to the centre of the image
dists = sqrt(X.^2 + Y.^2);
%// Find those points that are within the inner and outer radii
out = dists >= inner_radius & dists <= outer_radius;
%// Cap to ensure same mask size
out = out(1:rows,1:cols);
特别注意最后的陈述。如果要指定奇数尺寸,则相对于掩模的中心,相对于中心的坐标是正确的。例如,如果我们选择行为101,那么这应该从-50到50,包括中心,因此这恰好对应于101个点。我们应该指定...说... 100,当使用meshgrid
时,你仍然从-50到50得到坐标,所以这仍然会给我们一个掩码垂直方向(行)101点。为了确保您拥有符合指定尺寸的模板,我们希望确保在计算蒙版后提取出在开头指定的相同数量的行和列。差别只是一个像素边界,所以它不应该真正重要......但如果你是一个坚持者并想要相同的尺寸,那么这就是你需要做的事情。 / p>
如果我们指定rows = 101, cols = 101, inner_radius = 20, outer_radius = 40
,这就是我得到的面具: