1

这就是我遇到的困境。对于我的应用程序,我需要将图像L1与一组图像中匹配的L2进行匹配。L1L2是完全相同的图像,除了L1小得多(它需要放大吗?),并且可能在边缘有一点伪影,但尽管如此,它们来自完全相同的源图像。颜色确实很重要,因为使用颜色信息将消除当前图像与要匹配的图像之间可能存在的歧义。使用 OpenCV(或者可能有更好的选择?),找到匹配图像(L2)的最佳方法是什么。

重申一下,要匹配的图像无论如何都不会旋转或扭曲,只会调整大小。

我想会有一个函数来评估要匹配的图像与提供的集合中的所有图像的接近程度。然后我们选择评分最高的那个作为匹配。我不确定如何比较图像。任何帮助都会很棒。谢谢。

4

4 回答 4

2

转到 github 并查看 opencv-master\samples\cpp\matcher_simple.cpp(或 matching_to_many_images.cpp)

它不仅可以满足您的需求,而且还适用于具有透视失真的图像(例如旋转、仿射变换和照明变化)。简单地说,它非常健壮。

但是 SIFT 和 SURF 是专利的,你可能无法将它用于商业应用,这很糟糕。但有很多选择,只是谷歌周围!

于 2014-07-07T07:09:49.897 回答
1

OpenCV 有一个关于图像相似度测量的教程

在进行比较之前,您需要放大 L1,或缩小 L2。如果您将 L2 与大量图像进行比较,则缩小 L2 可能更有意义(因为您不必为要比较的每个图像调用调整大小,并且要比较的像素更少)。

例如

cv::Mat L1 = ...;
cv::Mat L2 = ...;

cv::Mat L2small;
cv::resize(L2, L2small, L1.size());
double pnsr = getPSNR(L1, L2small);
// where code for getPSNR() is in the tutorial
于 2014-07-07T06:52:43.200 回答
0

我认为您可以使用类似于用于测量文档相似性的词袋模型的东西。看看这个:链接

我正在复制下面的等式:

G = X'*X

其中 X = [x1 x2 ... xn]

在您的情况下,使用图像的归一化直方图作为向量 xi。

我认为您不必以这种方法调整图像的大小,而且速度会更快。

编辑

我在 Matlab 中使用 opencv 示例中提供的一些示例图像进行了尝试:

im1 = imread('baboon.jpg');
im2 = imread('board.jpg');
im3 = imread('fruits.jpg');
im4 = imread('fruits - small.jpg'); % fruits.jpg scaled down 25% using mspaint

% using grayscale for simplicity
gr1 = rgb2gray(im1);
gr2 = rgb2gray(im2);
gr3 = rgb2gray(im3);
gr4 = rgb2gray(im4);

[cnt_baboon, x] = imhist(gr1);
[cnt_board, x] = imhist(gr2);
[cnt_fruits, x] = imhist(gr3);
[cnt_fruits_small, x] = imhist(gr4);

% X: not normalized
X = [cnt_baboon cnt_board cnt_fruits cnt_fruits_small];
H = X'*X;
N = sqrt(diag(H)*diag(H)');
% normalize. this would be faster
G = H./N

生成的 G 矩阵:

G =

1.0000    0.8460    0.7748    0.7729
0.8460    1.0000    0.8741    0.8686
0.7748    0.8741    1.0000    0.9947
0.7729    0.8686    0.9947    1.0000

您可以看到 G(3,4)(和 G(4,3))非常接近 1。

于 2014-07-07T10:50:22.973 回答
0

我认为您正在寻找直方图匹配。有用于直方图匹配的内置函数,例如 bhattacharya 距离等,它们并不要求您的两个图像也具有相同的大小。

只需在 opencv 网站上查看此链接, 链接

于 2014-07-08T10:59:15.933 回答