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