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

时间:2015-10-27 11:11:57

标签: c++ opencv image-processing

我想找到源和图像列表之间的相似性比率,它们向用户输出最佳匹配图像。输入图像可以是任何形状,我的程序应该找到最匹配的图像。我是OpenCV的新手,但我正在尝试为我的实现学习它。我尝试了很多教程,并尝试找到一些样本,但没有一个满足我的要求。样本图像如下。 enter image description here

我尝试了以下方法:

  1. 比较直方图=>不是我实施的最佳方法
  2. 模板匹配=>图像可以具有不同的形状和大小。
  3. 功能匹配=>没有找到能够区分相似之处的最佳教程。
  4. 我尝试过的其他方法是SIFT,SURF和FAST,但它们都适用于点数据而不适用于形状数据。我正在使用openCV for C ++实现这一点。

1 个答案:

答案 0 :(得分:0)

尝试使用形状的签名,签名只是给你关于形状的边界的信息。

签名提取代码是:

            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函数更改形状的大小,并精确控制形状的签名长度。

形状签名

不同大小的

如下:

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