我希望匹配两个图像中的要素以检测复制移动伪造。我使用PCA-SIFT code来检测图像功能。但是,我在匹配PCA-SIFT功能时遇到了麻烦。根据几篇论文,类似的匹配过程用于SIFT中使用的PCA-SIFT。我使用了以下代码段来匹配功能。
%des1 and des2 are the PCA-SIFT descriptors obtained from two images
% Precompute matrix transpose
des2t = des2';
matchTable = zeros(1,size(des1,1));
cnt=0; %no. of matches
%ration of ditances
distRatio = 0.5;
%normalising features
m1=max(max(des1));
m2=max(max(des2));
m=max(m1,m2);
des1=des1./m;
des2=des2./m;
for i = 1 : size(des1,1)
%finding eucledian distance of a vector in one image to all features in second image
A=des1(i,:);
D = des2-repmat(A,size(des2,1),1);
[vals,indx] = sort((sum(D.^2,2)).^(1/2)); %sort distances
% Check if nearest neighbor has angle less than distRatio times 2nd.
if (vals(1) < distRatio * vals(2))
matchTable(i) = indx(1);
cnt=cnt+1;
else
matchTable(i) = 0;
end
end
cnt
以上代码适用于SIFT功能。但即使尝试了几个distRatio(0-1)
值,我也无法获得正确的PCA-SIFT功能结果。我也不确定PCA-SIFT的matlab中心代码(如上所述)是否完成this paper中提到的确切过程
如果有人对上述问题有任何疑问,请发表评论。
答案 0 :(得分:0)
问题是,PCA不能保留2个向量之间的欧氏距离。举一个简单的例子,你的数据沿着y = x线。沿着该线的2个点之间的距离将取决于两个坐标,即使您的所有数据都是1维,即沿着该线放置。当您应用PCA时,新的欧几里德距离将仅考虑主要成分,即y = x行,因此(1,1),(2,2)之间的距离将仅为1而不是sqrt(2) )。
但是,如果按照欧几里德范数对特征进行标准化,则使用欧氏距离的最近邻居相当于计算要素之间的余弦相似度(点积)。
https://en.wikipedia.org/wiki/Cosine_similarity
因此,如果您按照L2标准对它们进行标准化,我会首先建议您测试筛选功能的匹配是否有效。如果是,您可以对这些功能应用PCA,再次按照其L2标准对PCA功能进行标准化,然后计算欧氏距离。据我所知,筛选矢量的L2范数为1.因此,您只需要通过L2范数标准化PCA-SIFT特征并计算欧氏距离。