【问题标题】:Find similarity ratio between images [Best matching image]查找图像之间的相似度 [最佳匹配图像]
【发布时间】:2015-10-29 17:35:07
【问题描述】:

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

我尝试了以下方法:

  1. 比较直方图 => 不是我实施的最佳方法
  2. 模板匹配 => 图像可以有不同的形状和大小。
  3. 特征匹配 => 没有找到任何可以区分相似之处的最佳教程。

我尝试过的其他方法是 SIFT、SURF 和 FAST,但它们都适用于点数据而不适用于形状数据。我正在使用 C++ 的 openCV 来实现这一点。

【问题讨论】:

  • 我只是想知道,您的图像是否总是二进制的?和形状会像上面一样理想吗?
  • 必须制作二进制...因为它们都是形状匹配的,所以我猜不会是问题...
  • 我认为,与其使用无监督的方法,不如做一些类似的事情,比如计算圆形、正方形、矩形、三角形等,因为在这种情况下更容易。计算完形状后,您还可以从形状中提取信息,例如它们的大小、方向等,并利用这些信息根据您定义的相似度指标找到相似度。
  • 提取轮廓并使用 cv::matchShapes。 docs.opencv.org/modules/imgproc/doc/… 只是出于兴趣:你会说第一排 nr 3 和第一排 5 是否相似? “相似度”这个词非常含糊不清,所以根据你对相似度的定义,你必须选择或设计你的算法。
  • 霍夫变换很有帮助

标签: c++ opencv image-processing


【解决方案1】:

尝试使用形状的签名,签名只是为您提供特定形状边界的信息。

签名提取代码为:

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

形状的签名

不同尺寸如下:

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

【讨论】:

  • 感谢 miki 的编辑....当时我很着急,所以我只写了所有内容并提交了答案。
猜你喜欢
  • 2020-09-27
  • 1970-01-01
  • 2023-04-03
  • 2012-05-01
  • 2017-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多