C++ 查找图像之间的相似性比率[最佳匹配图像]

C++ 查找图像之间的相似性比率[最佳匹配图像],c++,opencv,image-processing,C++,Opencv,Image Processing,我想找到源图像和列表图像之间的相似性比率,以向用户输出最佳匹配的图像。输入图像可以是任何形状,我的程序应该能找到最匹配的图像。我对OpenCV非常陌生,但我正在努力学习它,以便实现它。我尝试了许多教程,并试图找到一些样本,但没有一个满足我的要求。示例图像如下所示。 我尝试了以下方法: 比较直方图=>不是我实现的最佳方法 模板匹配=>图像可以具有不同的形状和大小 Feature Matching=>没有找到任何可以区分相似性的最佳教程 我尝试的另一种方法是SIFT、SURF和FAST,但它们都适

我想找到源图像和列表图像之间的相似性比率,以向用户输出最佳匹配的图像。输入图像可以是任何形状,我的程序应该能找到最匹配的图像。我对OpenCV非常陌生,但我正在努力学习它,以便实现它。我尝试了许多教程,并试图找到一些样本,但没有一个满足我的要求。示例图像如下所示。

我尝试了以下方法:

  • 比较直方图=>不是我实现的最佳方法
  • 模板匹配=>图像可以具有不同的形状和大小
  • Feature Matching=>没有找到任何可以区分相似性的最佳教程

  • 我尝试的另一种方法是SIFT、SURF和FAST,但它们都适用于点数据,而不是形状数据。我使用C++的OpenCV实现这个。

    尝试使用形状的签名,签名只是给你关于形状的边界的信息。 用于提取签名的代码为:

                function sig = signature(bw,prec)
                boundry = bwboundaries(bw);
    
                xy = boundry{1};
    
                x = xy(:,1);
                y = xy(:,2);
    
                len = length(x);
                res = (len/prec);
    
                re = rem(res,2);
    
                if re
                    res = ceil(res);
                end
    
                indexes = 1:res:len;
    
                xnew = x(indexes);
                ynew = y(indexes);
    
                cx = round(mean(xnew));
                cy = round(mean(ynew));
    
                xn = abs(xnew-cx);
                yn = abs(ynew-cy);
    
                sig = (xn.^2+yn.^2);
                sig = sig/max(sig);
    
    如何使用上述功能的示例如下:

                clc
                clear all
                close all
    
                path = 'E:\GoogleDrive\Mathworks\irisDEt\shapes';
                im1 = imread([path,'\3.png']);
                gray1 = ((im1));
    
                scales = [1,2,3,4];
                gray1 = im2bw(gray1);
    
                for i = 1:length(scales)
                    im = imresize(gray1,scales(i));
                    sig = signature(im,25);
    
                    figure,plot(sig)
                    fra = getframe();
                    image = frame2im(fra);
                    imwrite(image,['E:\GoogleDrive\Mathworks\irisDEt\shapes\',num2str(i),'.png'])
                end
    
    在上面的示例中,我使用
    imresize
    函数选择一个形状并更改形状的大小,并通过精度控制形状签名的长度

    形状的特征

    不同尺寸的包装如下所示:


    以上所有签名都是由上面给出的代码生成的。

    我只是想知道,您的图像是否总是二进制的?和形状将是理想的像上面?必须使二元。。。因为它们都是形状匹配的,所以我想这不会是一个问题……我认为,与使用无监督的方法相比,你应该做一些事情,比如,计算圆、正方形、矩形、三角形等,因为在这种情况下,这要容易得多。计算形状后,还可以从形状中提取信息,如大小、方向等。利用这些信息,可以根据定义的相似性度量来查找相似性。提取轮廓并使用cv::matchShapes。只是出于兴趣:你会说第一排nr 3和第一排编号5相似吗?术语“相似性”非常模糊和不清楚,因此根据您对相似性的定义,您必须选择或设计您的算法。Hough变换可能会有所帮助感谢miki的编辑。。。。当时我很匆忙,所以我写了所有的东西并提交了答案。