繁体   English   中英

在openCV中匹配最近的图像?

[英]Matching closest image in openCV?

这就是我所拥有的困境。 对于我的应用程序,我需要在一组图像中匹配图像L1和匹配的一个L2 L1L2是完全相同的图像,除了L1要小得多(它需要是高档的?),并且可以在边缘上稍微制作,但是,它们来自完全相同的源图像。 颜色很重要,因为使用颜色信息将消除当前图像与要匹配的图像之间可能存在的歧义。 使用OpenCV(或者可能有更好的选择?),找到匹配图像( L2 )的最佳方法是什么。

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

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

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

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

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

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

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

例如

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

我想你可以使用类似于用于衡量文档相似性的词袋模型。 看看这个: 链接

我正在复制下面的等式:

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。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM