我想找到源和图像列表之间的相似性比率,它们向用户输出最佳匹配图像。输入图像可以是任何形状,我的程序应该找到最匹配的图像。我是OpenCV的新手,但我正在尝试为我的实现学习它。我尝试了很多教程,并尝试找到一些样本,但没有一个满足我的要求。样本图像如下。
我尝试了以下方法:
我尝试过的其他方法是SIFT,SURF和FAST,但它们都适用于点数据而不适用于形状数据。我正在使用openCV for C ++实现这一点。
答案 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
函数更改形状的大小,并精确控制形状的签名长度。
形状签名
不同大小的
如下:
以上所有签名都是由上面给出的代码生成的。