旋转模板以匹配边缘

时间:2018-03-28 04:47:14

标签: matlab image-processing computer-vision

(我使用MATLAB R2015a)。我有一个对象的边缘点图(使用边缘检测获得),我有一个对象模板的图。我想旋转模板,直到它与检测到的边缘点匹配。 (图中包含的链接:实心蓝色 - 模板,红点 - 边缘检测点;旋转是微妙的,但它就在那里。)

  • 我计划通过不同的thetas值(在我知道怎么做)中围绕质心旋转模板,并要求代码在匹配时停止执行与边缘'(这是我想知道的)并返回相应的theta。

  • 构成模板的点数和构成边的点数不一样,因此将图分成3行和1(半)椭圆并直接比较不起作用。

    < / LI>
  • 由于在每个帧中检测边缘的方式,因此使用regionprops'orientation'不会为每个帧提供预期结果。 (如果需要,我可以详细说明)

  • 我有意使用绘图绘制点,而不是将边缘保持为BW图像,因为否则,我必须在创建模板时舍入索引,对于我的应用程序,我不能丢失这样的精确度。

Figure

我不是懒惰,我不希望有人为我编码。我的想法都没有用,我也无法以任何不同的方式思考,所以也许在Matlab有新思维和更多经验的人会有一些想法。

2 个答案:

答案 0 :(得分:0)

假设图像和模板都是位图(=模板不是3x线+椭圆的一半),你知道模板的位置和大小,而不是角度:

对于每个边缘,找到模板上最近的点,并求和所有距离,或者可能是距离的平方和,或者一些惩罚许多小异常值的其他指标的总和 - 如果旋转略有错误,许多点会略有错误。完全错误的几点是要忽略的噪音。所以,像:

minDist = inf;
minAngle = -1;
for t = 1 : length(thetas)
templatePoints = ...; % calculate template points.
for i = 1 : length(edges)
    edge = edges(i); % assuming this edge is (x, y) edge point
    mind = inf; % Min distance
    for j = 1 : length(templatePoints)
        d = sum(sqrt((edge - templatePoints).^2));
        if (d < mind)
           mind = d;
        end
    end
end
currentDist = sum(mind);
if (currentDist < minDist)
    ...
end

完成模板旋转的整个圆圈后,选择具有最小差异的旋转。

此过程可能有点问题,因为您可能将模板旋转了10.5度并且您将进行1度的步骤,因此最终您将无法获得完全最佳的角度。另外,你将尝试大量完全错误的角度,减慢你的速度。 但要找到最佳角度,你可以改变角度步长,比如你先每10度旋转一次,然后每1度左右最小,然后每0.1度等。或者使用优化方法。如果您没有太多噪音,渐变下降应该可以正常工作,对于噪声图像使用模拟退火。使用与上面相同的代码,currentDist是一个足够好的优化参数 - 它应该尽可能接近0。

如果您的模板尺寸未知或模板位置未知,您肯定应该使用模拟退火,渐变下降几乎肯定会陷入局部最小值。使用与上面类似的代码计算边和模板之间的差异,并将所有未知参数放入方法中。

答案 1 :(得分:0)

一种选择是为每次旋转制作结果图像,但不要将其设为二进制,使其成为灰度。有一些方法可以使“最大插值边缘”成为连续函数的位置(例如Xiaolin Wu's line algorithm)。

在匹配图像时,您不会失去精确度,而是将目标的精度设置为与图像相同的水平。

一旦得到这个,对于每个轮换,使用度量来评估2个灰度(是,非二进制)图像如何匹配,使用相关系数,互信息,通用质量指数(UQI)等。