Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Image 匹配openCV中最近的图像?_Image_Opencv_Classification_Vision - Fatal编程技术网

Image 匹配openCV中最近的图像?

Image 匹配openCV中最近的图像?,image,opencv,classification,vision,Image,Opencv,Classification,Vision,这是我吃的迪伦玛。对于我的应用程序,我需要在一组图像中将图像L1与匹配的图像L2进行匹配L1和L2是完全相同的图像,不同的是L1要小得多(需要更高的比例?),并且可能会在边缘上产生一些伪影,但是,它们来自完全相同的源图像。颜色确实很重要,因为使用颜色信息可以消除当前图像和要匹配的图像之间可能存在的歧义。使用OpenCV(或者可能有更好的选择?),找到匹配图像(L2)的最佳方法是什么 再次重申,要匹配的图像不会旋转或扭曲,只会调整大小 我猜会有一个函数,它评估要匹配的图像与所提供集合中所有图像的接

这是我吃的迪伦玛。对于我的应用程序,我需要在一组图像中将图像L1与匹配的图像L2进行匹配L1L2是完全相同的图像,不同的是L1要小得多(需要更高的比例?),并且可能会在边缘上产生一些伪影,但是,它们来自完全相同的源图像。颜色确实很重要,因为使用颜色信息可以消除当前图像和要匹配的图像之间可能存在的歧义。使用OpenCV(或者可能有更好的选择?),找到匹配图像(L2)的最佳方法是什么

再次重申,要匹配的图像不会旋转或扭曲,只会调整大小

我猜会有一个函数,它评估要匹配的图像与所提供集合中所有图像的接近程度。然后我们选择评分最高的一个作为匹配。我不知道如何比较这些图像。任何帮助都会很好。谢谢。

OpenCV已经发布了

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

e、 g


转到github并查看opencv master\samples\cpp\matcher\u simple.cpp(或将\u匹配到\u many\u images.cpp)

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


但SIFT和SURF是专利,你可能无法将其用于商业应用,这很糟糕。但有很多选择,只是谷歌左右

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

我复制了下面的等式:

G=X'*X

其中X=[x1 x2…xn]

在您的情况下,使用图像的强>标准化直方图< /强>作为向量席.< /P> 我想你不必用这种方法调整图像的大小,而且速度会更快

编辑

我在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=


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

我想你在寻找直方图匹配。有用于直方图匹配的内置函数,例如bhattacharya距离等,它们不要求两幅图像的大小相同

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

如果它们真的是完全相同的图像(除了缩放和一些瑕疵),我想首先将L2缩小到L1的大小,计算
cv::absDiff
。在这种情况下,具有最低平均像素差(L2标准)的图像应该是最相似的图像。如果它们是专利,你甚至不能将它们用于研究或开源,除非你得到专利持有者的明确许可。幸运的是;这些专利只存在于美国。@Nallath我相信你将不得不引用他们的论文进行研究。只是不要使用他们的代码并购买matlab或其他东西,这取决于他们发布代码的许可证。他们可能(如果他们如此倾向的话)阻止你甚至对那个领域进行研究。
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
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