在MATLAB中匹配具有不同方向和尺度的图像
我有两张相似但方向和大小不同的图像。 一个例子可以在下面看到:
有没有办法匹配这两个图像?
我使用Procrustes形状分析,但有其他方法吗?
查看图像旋转和缩放使用计算机视觉系统工具箱中的自动特征匹配示例。
它展示了如何检测兴趣点,提取和匹配特征描述符,并计算两幅图像之间的转换。
这是让你开始的东西。 你所要求的是一个经典的问题,即图像注册。 图像注册试图找到正确的单应性,它将一幅图像与另一幅图像对齐。 这包括找到两幅图像之间常见的兴趣点或关键点,并确定两幅图像之间哪些关键点匹配。 一旦你有了这些点对,你就可以确定一个单应性矩阵,并扭曲其中一个图像,使它们与这个矩阵相互对齐。
我将假设您拥有属于MATLAB的计算机视觉和图像处理工具箱。 如果你不这样做,那么Maurits给出的答案是一个很好的选择,VLFeat工具箱也是我用过的。
首先,让我们直接从StackOverflow中读取图像:
im = imread('http://i.stack.imgur.com/vXqe8.png');
im2 = imread('http://i.stack.imgur.com/Pd7pt.png');
im_gray = rgb2gray(im);
im2_gray = rgb2gray(im2);
由于关键点检测算法需要灰度图像,因此我们还需要转换为灰度。 接下来,我们可以使用属于MATLAB的CVST的任何特征检测算法....我将使用SURF,因为它与SIFT基本相同,但有一些小的但关键的区别。 您可以使用属于CVST工具箱一部分的detectSURFFeatures
功能,并接受灰度图像。 输出是一个结构,其中包含有关算法为图像检测到的每个特征点的一组信息。 让我们将其应用于这两个图像(灰度)。
points = detectSURFFeatures(im_gray);
points2 = detectSURFFeatures(im2_gray);
一旦我们检测到这些特征,现在就是抽出 描述这些关键点的描述符的时候了。 这可以通过extractFeatures
完成。 这需要灰度图像以及从detectSURFFeatures
输出的相应结构。 输出是一些后处理后的一组功能和有效的关键点。
[features1, validPoints1] = extractFeatures(im_gray, points);
[features2, validPoints2] = extractFeatures(im2_gray, points2);
现在是匹配两幅图像之间特征的时候了。 这可以用matchFeatures
来完成,它需要两个图像之间的特征:
indexPairs = matchFeatures(features1, features2);
indexPairs
是一个2D数组,第一列告诉你第一个图像中的哪个特征点与第二个图像中存储的第二个图像中的匹配。 我们会用它来索引我们的有效点,以充实实际匹配的内容。
matchedPoints1 = validPoints1(indexPairs(:, 1), :);
matchedPoints2 = validPoints2(indexPairs(:, 2), :);
然后我们可以通过使用showMatchedFeatures
来显示匹配的点。 我们可以将两个图像彼此并排放置,并在匹配的关键点之间画线,以查看哪些匹配。
figure;
showMatchedFeatures(im, im2, matchedPoints1, matchedPoints2, 'montage');
这是我得到的:
这并不完美,但它确实发现两幅图像之间的一致性匹配。
现在我们下一步需要做的是找到单应性矩阵并对图像进行扭曲。 我将使用estimateGeometricTransform
以便我们可以找到一个将一组点转换为另一个点的转换。 正如迪马在下面对我的评论中指出的那样,这通过RANSAC 强有力地确定了最好的单应性矩阵。 我们可以这样调用estimateGeometricTransform
:
tform = estimateGeometricTransform(matchedPoints1.Location,...
matchedPoints2.Location, 'projective');
第一个输入需要一组输入点,这是您要转换的点。 第二输入发生在一组其是基准点的基点 。 这些点是我们想要匹配的。
在我们的例子中,我们想要从第一个图像中剔除点 - 人站起来并使其与第二个图像匹配 - 靠在他旁边的人,因此第一个输入是来自第一个图像的点,第二个输入是来自第二个图像的点。
对于匹配的点,我们希望引用“ Location
字段,因为它们包含两个图像之间实际点匹配的坐标。 我们也使用projective
来解释尺度,剪切和旋转。 输出结果包含了我们对点的转换。
接下来我们要做的是使用imwarp
来扭曲第一个图像,以便与第二个图像对齐。
out = imwarp(im, tform);
out
将包含我们的扭曲图像。 如果我们并排显示第二个图像和这个输出图像:
figure;
subplot(1,2,1);
imshow(im2);
subplot(1,2,2);
imshow(out);
这是我们得到的:
我会说这很好,你不觉得吗?
为了您的复制和粘贴乐趣,以下是完整代码的外观:
im = imread('http://i.stack.imgur.com/vXqe8.png');
im2 = imread('http://i.stack.imgur.com/Pd7pt.png');
im_gray = rgb2gray(im);
im2_gray = rgb2gray(im2);
points = detectSURFFeatures(im_gray);
points2 = detectSURFFeatures(im2_gray);
[features1, validPoints1] = extractFeatures(im_gray, points);
[features2, validPoints2] = extractFeatures(im2_gray, points2);
indexPairs = matchFeatures(features1, features2);
matchedPoints1 = validPoints1(indexPairs(:, 1), :);
matchedPoints2 = validPoints2(indexPairs(:, 2), :);
figure;
showMatchedFeatures(im, im2, matchedPoints1, matchedPoints2, 'montage');
tform = estimateGeometricTransform(matchedPoints1.Location,...
matchedPoints2.Location, 'projective');
out = imwarp(im, tform);
figure;
subplot(1,2,1);
imshow(im2);
subplot(1,2,2);
imshow(out);
在旁边
请记住,我使用的默认参数的一切...所以detectSURFFeatures
, matchFeatures
等您可能需要玩弄参数,以获得一致的结果跨越不同的图像对你尝试。 我会把这些留给你作为练习。 看看我上面关于每个功能链接的所有链接,以便您可以随意使用参数来适应您的口味。
玩得开心,祝你好运!
您可以通过以下方式获得合理的结果:
vl_ubcmatch
最初的结果是:
链接地址: http://www.djcxy.com/p/79573.html上一篇: Matching images with different orientations and scales in MATLAB