之前提到了巴氏距离,巴氏距离用来检测两张图像不像是一个很好的工具哟~
我们就用Matlab来检测一下巴氏距离的威力吧!
这是我大国武的樱顶,想想清明时节樱花纷飞现在被我拿来做实验,理工男啊!
当樱花以秒速3.5米下落,我又该如何寻思你。
首先这是主教拍摄樱顶的图片
这张是上半部分,但是两张还是很想哦,至少人类是这么认为的。
这是第三张,基本就不太能够辨认了。
我们把第一张图片对应的直方图称为PsOrg,第二张很匹配的称为PsMa,第三张对应的直方图称为PsNonMa。请原谅我把c++命名习惯放到Matlab里面来了。然后我们要做的就是计算第二张图片与原图(第一张图片)之间的巴氏距离,以及第三张图片与第二张图片之间的巴氏距离。反正,结果是这样的:
这是三张图片对应的直方图。
这是最后的两个巴氏距离,当然啦,前一个第一张和第二张的,后一个是第一张和第三张的。说明第一张图片和第二张图片更加像,看来我的眼光还是挺好哒。
不说了,上matlab 的程序:
clc
fn='I:\orginalPicture.png';
I=imread (fn);
J=I;
%计算灰度图象的直方图数据
L=256; %灰度级
PsOrg = zeros(L,1); %统计直方图结果数据
nk=zeros(L,1);
[row,col]=size(I);
n=row*col; %总像素个数
for i = 1:row
for j = 1:col
num = double(I(i,j))+1; %获取像素点灰度级
nk(num) = nk(num)+1; %统计nk
end
end
%计算直方图概率估计
for i=1:L
PsOrg(i)=nk(i)/n;
end
figure;
subplot(2,1,1);imshow(J),title('原图');
subplot(2,1,2),bar(PsOrg),title('直方图');
、、
%figure;
%subplot(3,1,1);
�r(PsOrg);
%subplot(3,1,2);
�r(PsMa);
%subplot(3,1,3);
�r(PsNon);
sumMa = 0;
sumNonMa =0;
for i = 1:256
sumMa=sumMa+sqrt(PsMa(i)*PsOrg(i));
sumNonMa=sumNonMa+sqrt(PsNon(i)*PsOrg(i));
end
sumMa
sumNonMa
%figure(4),imhist(hist);
%p=imhist(hist); %生成直方图函数,返回灰度图象直方图数据
%figure(5),plot(p);
这一段可以算出图片的直方图和直方图矩阵,三张图片都可以这么算
sumMa = 0;
sumNonMa =0;
for i = 1:256
sumMa=sumMa+sqrt(PsMa(i)*PsOrg(i));
sumNonMa=sumNonMa+sqrt(PsNon(i)*PsOrg(i));
end
sumMa
sumNonMa
这一段就是求两个巴氏距离的程序。