我可以使用什么算法在这个查询图像中找到这个提取的模板图像?
What algorithm can I use to find this extracted template image in this query image?
我试图在查询图像中找到提取的模板图像的位置,我尝试使用冲浪算法但无法找到它,请问我可以使用什么其他算法来找到这个模板?
您尝试做的事情相对简单明了,尤其是如果您有一个干净的指纹数据集。
您可以使用 Wavelet Transform 提取这些特征。
它会使用树结构分解您的指纹图像,您可以提取图像中您感兴趣的部分。
我很确定您可以在 GitHub 上找到很多包。
-
-
-
-
如果你可以在Python中编码,PyWavelets也是一个选择,否则你可以使用MATLAB:
如何在MatLab中实现:
这段代码只是在 MatLab 中实现图像处理算法的一个例子。
Source Code
%WAVELET
clear all;
clc;
data=imread('sidikjari5.jpg');
r=data(:,:,1);
g=data(:,:,2);
b=data(:,:,3);
gray=double(0.333*r+0.333*g+0.333*b)/512;
[m, n] = size(gray);
%=================== WAVELET LV 1 ===================%
mm=m/2;
nn=n/2;
for i=1:mm
for j=1:nn
cb1=(gray(i*2-1,j*2));
%cb1=double(cb1);
cb2=(gray(i*2,j*2-1));
%cb2=double(cb2);
ca(i,j)=sqrt(cb1^2+cb2^2);
end
end
[m1,n1]=size(ca);
for i=1:mm
for j=1:nn
cb1=(gray(i*2-1,j*2-1));
cb2=(gray(i*2,j*2-1));
cv(i,j)=(cb1+cb2)/2;
end
end
[m2,n2]=size(cv);
for i=1:mm
for j=1:nn
cb1=(gray(i*2-1,j*2-1));
cb2=(gray(i*2-1,j*2));
ch(i,j)=(cb1+cb2)/2;
end
end
[m3,n3]=size(ch);
for i=1:mm
for j=1:nn
cb1=(gray(i*2-1,j*2-1));
cb2=(gray(i*2,j*2));
cd(i,j)=(cb1+cb2)/2;
end
end
[m4,n4]=size(cd);
l1=figure;
imshow(l1);
subplot(2,2,1);
imshow(ca);
title('ca');
subplot(2,2,2);
imshow(ch);
title('ch');
subplot(2,2,3);
imshow(cv);
title('cv');
subplot(2,2,4);
imshow(cd);
title('cd');
%=================== WAVELET LV 2 ===================%
mmm=m1/2;
nnn=n1/2;
for i=1:mmm
for j=1:nnn
cb1=(ca(i*2-1,j*2));
cb2=(ca(i*2,j*2-1));
ca2(i,j)=sqrt(cb1^2+cb2^2);
end
end
[mm1,nn1]=size(ca2);
for i=1:mmm
for j=1:nnn
cb1=(ca(i*2-1,j*2-1));
cb2=(ca(i*2,j*2-1));
cv2(i,j)=(cb1+cb2)/2;
end
end
[mm2,nn2]=size(cv2);
for i=1:mmm
for j=1:nnn
cb1=(ca(i*2-1,j*2-1));
cb2=(ca(i*2-1,j*2));
ch2(i,j)=(cb1+cb2)/2;
end
end
[mm3,nn3]=size(ch2);
for i=1:mmm
for j=1:nnn
cb1=(ca(i*2-1,j*2-1));
cb2=(ca(i*2,j*2));
cd2(i,j)=(cb1+cb2)/2;
end
end
[mm4,nn4]=size(cd2);
l2=figure;
imshow(l2);
subplot(2,2,1);
imshow(ca2);
title('ca2');
subplot(2,2,2);
imshow(ch2);
title('ch2');
subplot(2,2,3);
imshow(cv2);
title('cv2');
subplot(2,2,4);
imshow(cd2);
title('cd2');
%=================== WAVELET LV 3 ===================%
mmmm=mm1/2;
nnnn=nn1/2;
for i=1:mmmm
for j=1:nnnn
cb1=(ca2(i*2-1,j*2));
cb2=(ca2(i*2,j*2-1));
ca3(i,j)=sqrt(cb1^2+cb2^2);
end
end
[mmm1,nnn1]=size(ca3);
for i=1:mmmm
for j=1:nnnn
cb1=(ca2(i*2-1,j*2-1));
cb2=(ca2(i*2,j*2-1));
cv3(i,j)=(cb1+cb2)/2;
end
end
[mmm2,nnn2]=size(cv3);
for i=1:mmmm
for j=1:nnnn
cb1=(ca2(i*2-1,j*2-1));
cb2=(ca2(i*2-1,j*2));
ch3(i,j)=(cb1+cb2)/2;
end
end
[mmm3,nnn3]=size(ch3);
for i=1:mmmm
for j=1:nnnn
cb1=(ca2(i*2-1,j*2-1));
cb2=(ca2(i*2,j*2));
cd3(i,j)=(cb1+cb2)/2;
end
end
[mmm4,nnn4]=size(cd3);
level1=[ca cv;
ch cd;];
level2ca=[ca2 cv2;
ch2 cd2];
level3ca=[ca3 cv3;
ch3 cd3];
l3=figure;
imshow(l3);
subplot(2,2,1);
imshow(ca3);
title('ca3');
subplot(2,2,2);
imshow(ch3);
title('ch3');
subplot(2,2,3);
imshow(cv3);
title('cv3');
subplot(2,2,4);
imshow(cd3);
title('cd3');
%=================== EKSTRAKSI CIRI WAVELET LV 3 ===================%
rerataca3 = mean2(ca3); %fitur
reratach3 = mean2(ch3); %fitur
reratacv3 = mean2(cv3); %fitur
reratacd3 = mean2(cd3); %fitur
sdevca3 = std2(ca3); %fitur
sdevch3 = std2(ch3); %fitur
sdevcv3 = std2(cv3); %fitur
sdevcd3 = std2(cd3); %fitur
varca3 = sdevca3^2; %fitur
varch3 = sdevch3^2; %fitur
varcv3 = sdevcv3^2; %fitur
varcd3 = sdevcd3^2; %fitur
x=[rerataca3 reratach3 sdevca3 sdevch3 varca3 varch3]
更新
我建议在 GitHub 上寻找已经开发的软件包,或者搜索类似的 MatLab 示例(如果有)。然后,将该包或示例应用到您的图像,看看它是如何工作的。在此过程中,您可能会遇到一些问题,例如在使用任何时频方法映射图像之前可能需要对图像进行预处理。
如果不是,那么你可以从 here, if you would like to write from scratch. More specifically, Discrete Wavelet Packet Transforms 开始,这对你的图像来说可能是一种有效的算法。
小波包的设计好像和trees差不多。将它们应用到图像后,您还可以定义和设计一些 mathematical/statistical 标准以从指纹图像中提取这些特征。
我试图在查询图像中找到提取的模板图像的位置,我尝试使用冲浪算法但无法找到它,请问我可以使用什么其他算法来找到这个模板?
您尝试做的事情相对简单明了,尤其是如果您有一个干净的指纹数据集。
您可以使用 Wavelet Transform 提取这些特征。
它会使用树结构分解您的指纹图像,您可以提取图像中您感兴趣的部分。
我很确定您可以在 GitHub 上找到很多包。
如果你可以在Python中编码,PyWavelets也是一个选择,否则你可以使用MATLAB:
如何在MatLab中实现:
这段代码只是在 MatLab 中实现图像处理算法的一个例子。
Source Code
%WAVELET
clear all;
clc;
data=imread('sidikjari5.jpg');
r=data(:,:,1);
g=data(:,:,2);
b=data(:,:,3);
gray=double(0.333*r+0.333*g+0.333*b)/512;
[m, n] = size(gray);
%=================== WAVELET LV 1 ===================%
mm=m/2;
nn=n/2;
for i=1:mm
for j=1:nn
cb1=(gray(i*2-1,j*2));
%cb1=double(cb1);
cb2=(gray(i*2,j*2-1));
%cb2=double(cb2);
ca(i,j)=sqrt(cb1^2+cb2^2);
end
end
[m1,n1]=size(ca);
for i=1:mm
for j=1:nn
cb1=(gray(i*2-1,j*2-1));
cb2=(gray(i*2,j*2-1));
cv(i,j)=(cb1+cb2)/2;
end
end
[m2,n2]=size(cv);
for i=1:mm
for j=1:nn
cb1=(gray(i*2-1,j*2-1));
cb2=(gray(i*2-1,j*2));
ch(i,j)=(cb1+cb2)/2;
end
end
[m3,n3]=size(ch);
for i=1:mm
for j=1:nn
cb1=(gray(i*2-1,j*2-1));
cb2=(gray(i*2,j*2));
cd(i,j)=(cb1+cb2)/2;
end
end
[m4,n4]=size(cd);
l1=figure;
imshow(l1);
subplot(2,2,1);
imshow(ca);
title('ca');
subplot(2,2,2);
imshow(ch);
title('ch');
subplot(2,2,3);
imshow(cv);
title('cv');
subplot(2,2,4);
imshow(cd);
title('cd');
%=================== WAVELET LV 2 ===================%
mmm=m1/2;
nnn=n1/2;
for i=1:mmm
for j=1:nnn
cb1=(ca(i*2-1,j*2));
cb2=(ca(i*2,j*2-1));
ca2(i,j)=sqrt(cb1^2+cb2^2);
end
end
[mm1,nn1]=size(ca2);
for i=1:mmm
for j=1:nnn
cb1=(ca(i*2-1,j*2-1));
cb2=(ca(i*2,j*2-1));
cv2(i,j)=(cb1+cb2)/2;
end
end
[mm2,nn2]=size(cv2);
for i=1:mmm
for j=1:nnn
cb1=(ca(i*2-1,j*2-1));
cb2=(ca(i*2-1,j*2));
ch2(i,j)=(cb1+cb2)/2;
end
end
[mm3,nn3]=size(ch2);
for i=1:mmm
for j=1:nnn
cb1=(ca(i*2-1,j*2-1));
cb2=(ca(i*2,j*2));
cd2(i,j)=(cb1+cb2)/2;
end
end
[mm4,nn4]=size(cd2);
l2=figure;
imshow(l2);
subplot(2,2,1);
imshow(ca2);
title('ca2');
subplot(2,2,2);
imshow(ch2);
title('ch2');
subplot(2,2,3);
imshow(cv2);
title('cv2');
subplot(2,2,4);
imshow(cd2);
title('cd2');
%=================== WAVELET LV 3 ===================%
mmmm=mm1/2;
nnnn=nn1/2;
for i=1:mmmm
for j=1:nnnn
cb1=(ca2(i*2-1,j*2));
cb2=(ca2(i*2,j*2-1));
ca3(i,j)=sqrt(cb1^2+cb2^2);
end
end
[mmm1,nnn1]=size(ca3);
for i=1:mmmm
for j=1:nnnn
cb1=(ca2(i*2-1,j*2-1));
cb2=(ca2(i*2,j*2-1));
cv3(i,j)=(cb1+cb2)/2;
end
end
[mmm2,nnn2]=size(cv3);
for i=1:mmmm
for j=1:nnnn
cb1=(ca2(i*2-1,j*2-1));
cb2=(ca2(i*2-1,j*2));
ch3(i,j)=(cb1+cb2)/2;
end
end
[mmm3,nnn3]=size(ch3);
for i=1:mmmm
for j=1:nnnn
cb1=(ca2(i*2-1,j*2-1));
cb2=(ca2(i*2,j*2));
cd3(i,j)=(cb1+cb2)/2;
end
end
[mmm4,nnn4]=size(cd3);
level1=[ca cv;
ch cd;];
level2ca=[ca2 cv2;
ch2 cd2];
level3ca=[ca3 cv3;
ch3 cd3];
l3=figure;
imshow(l3);
subplot(2,2,1);
imshow(ca3);
title('ca3');
subplot(2,2,2);
imshow(ch3);
title('ch3');
subplot(2,2,3);
imshow(cv3);
title('cv3');
subplot(2,2,4);
imshow(cd3);
title('cd3');
%=================== EKSTRAKSI CIRI WAVELET LV 3 ===================%
rerataca3 = mean2(ca3); %fitur
reratach3 = mean2(ch3); %fitur
reratacv3 = mean2(cv3); %fitur
reratacd3 = mean2(cd3); %fitur
sdevca3 = std2(ca3); %fitur
sdevch3 = std2(ch3); %fitur
sdevcv3 = std2(cv3); %fitur
sdevcd3 = std2(cd3); %fitur
varca3 = sdevca3^2; %fitur
varch3 = sdevch3^2; %fitur
varcv3 = sdevcv3^2; %fitur
varcd3 = sdevcd3^2; %fitur
x=[rerataca3 reratach3 sdevca3 sdevch3 varca3 varch3]
更新
我建议在 GitHub 上寻找已经开发的软件包,或者搜索类似的 MatLab 示例(如果有)。然后,将该包或示例应用到您的图像,看看它是如何工作的。在此过程中,您可能会遇到一些问题,例如在使用任何时频方法映射图像之前可能需要对图像进行预处理。
如果不是,那么你可以从 here, if you would like to write from scratch. More specifically, Discrete Wavelet Packet Transforms 开始,这对你的图像来说可能是一种有效的算法。