这是我所拥有的困境。对于我的应用程序,我需要在一组图像中匹配图像 L1 与匹配的 L2 。 L1 和 L2 是完全相同的图像,除了 L1 要小得多(它需要高档吗?),并且可能被制作成一个边缘很少,但是,它们来自完全相同的源图像。颜色很重要,因为使用颜色信息将消除当前图像与要匹配的图像之间可能存在的歧义。使用OpenCV(或者可能有更好的选择?),找到匹配图像的最佳方法是什么( L2 )。
重申一下,要匹配的图像无论如何都不会旋转或扭曲,只会调整大小。
我想会有一个函数来评估要匹配的图像与所提供的集合中的所有图像的接近程度。然后我们选择评分最高的那个作为匹配。我不确定如何比较图像。任何帮助都会很棒。感谢。
答案 0 :(得分:2)
转到github并查看opencv-master \ samples \ cpp \ matcher_simple.cpp(或matching_to_many_images.cpp)
它不仅可以满足您的需求,而且还适用于具有透视失真的图像(例如旋转,仿射变换和照明变化)。简单地说,它非常强大。
但是SIFT和SURF已获得专利,您可能无法将其用于商业应用,这很糟糕。但是有很多选择,只是谷歌周围!
答案 1 :(得分:1)
OpenCV有a tutorial on similarity measurement for images。
在进行比较之前,您需要升级L1,或者缩小L2。如果你将L2与大量图像进行比较,那么缩小L2可能更有意义(因为你不必为每个被比较的图像调用resize,并且要比较的像素更少)。
e.g。
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
答案 2 :(得分:0)
我认为您可以使用与用于衡量文档相似性的词袋模型类似的东西。看看这个:link
我正在复制以下等式:
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.
答案 3 :(得分:0)
我认为您正在寻找直方图匹配。有用于直方图匹配的内置函数,例如bhattacharya距离等,并且它们也不需要两个图像具有相同的大小。
只需在opencv网站上查看此链接, link