Matlab Harris角点匹配

图像课程作业,仅供参考
题目:用Harris算子和归一化互相关实现两幅图的匹配
在这里插入图片描述
在这里插入图片描述
1、自定义Harris函数,寻找图像的Harris角点坐标
(Harris.m)

% coords:图像角点坐标集合(为了方便后期使用归一化互相关做匹配)
function coords=Harris(I)
    [m,n]=size(I);
    %imshow(I);
    %===================================
    % Step 1:计算相关矩阵M
    %===================================
    tmp=zeros(m+2,n+2);
    tmp(2:m+1,2:n+1)=I; % 补零
    Ix=zeros(m+2,n+2);% x方向梯度
    Iy=zeros(m+2,n+2);% y方向梯度
    Ix(:,2:n)=tmp(:,3:n+1)-tmp(:,1:n-1);
    Iy(2:m,:)=tmp(3:m+1,:)-tmp(1:m-1,:);
    Ix2=Ix(2:m+1,2:n+1).^2;
    Iy2=Iy(2:m+1,2:n+1).^2;
    Ixy=Ix(2:m+1,2:n+1).*Iy(2:m+1,2:n+1);
    h=fspecial('gaussian',[7 7],2);
    Ix2=filter2(h,Ix2);
    Iy2=filter2(h,Iy2);
    Ixy=filter2(h,Ixy);
    %===================================
    % Step 2:计算Harris角点响应
    %===================================
    k=0.05; % k常取0.04-0.06
    Rmax=0;
    R=zeros(m,n);
    for i=1:m
        for j=1:n
            M=[Ix2(i,j) Ixy(i,j);Ixy(i,j) Iy2(i,j)];
            R(i,j)=det(M)-k*(trace(M))^2;     
            if R(i,j)>Rmax
                Rmax=R(i,j);
            end
        end
    end
    %===================================
    % Step 3:寻找Harris角点
    %===================================
    tmp(2:m+1,2:n+1)=R;
    %res=zeros(m+2,n+2);
    %res(2:m+1,2:n+1)=I;
    coords=[];
    for i=2:m+1
        for j=2:n+1
            % 在3*3邻域内非极大值抑制
            if tmp(i,j)>0.01*Rmax &&...
               tmp(i,j)>tmp(i-1,j-1) && tmp(i,j)>tmp(i-1,j) && tmp(i,j)>tmp(i-1,j+1) &&...
               tmp(i,j)>tmp(i,j-1) && tmp(i,j)>tmp(i,j+1) &&...
               tmp(i,j)>tmp(i+1,j-1) && tmp(i,j)>tmp(i+1,j) && tmp(i,j)>tmp(i+1,j+1)
                    %res(i,j)=255; 
                    coords=[coords,[i-1;j-1]];
            end    
        end
    end
    %coords
    %figure,imshow(mat2gray(res(2:m+1,2:n+1)));
end

2、计算互相关矩阵寻找匹配Harris角点对
(程序入口)

I1=imread('C:\Users\53121\Desktop\boat1.bmp');  
I2=imread('C:\Users\53121\Desktop\boat2.bmp');  
coords1=Harris(I1);  
coords2=Harris(I2);  
%===================================  
% 计算互相关矩阵R  
%===================================  
[~,m]=size(coords1);%获取图像1的角度个数  
[~,n]=size(coords2);%获取图像2的角度个数  
R=zeros(m,n);%互相关矩阵  
[r1,c1]=size(I1);  
[r2,c2]=size(I2);  
r=2;%角点匹配领域半径  
I1_tmp=zeros(r1+2*r,c1+2*r);  
I2_tmp=zeros(r2+2*r,c2+2*r);  
I1_tmp(r+1:r1+r,r+1:c1+r)=I1;  
I2_tmp(r+1:r2+r,r+1:c2+r)=I2;  
for i=1:m  
    x1=coords1(1,i)+r;   
    y1=coords1(2,i)+r;  
    for j=1:n  
        x2=coords2(1,j)+r;  
        y2=coords2(2,j)+r;  
        I1_mean=mean(mean(I1_tmp(x1-r:x1+r,y1-r:y1+r)));  
        I2_mean=mean(mean(I2_tmp(x2-r:x2+r,y2-r:y2+r)));  
        a=I1_tmp(x1-r:x1+r,y1-r:y1+r)-I1_mean;  
        b=I2_tmp(x2-r:x2+r,y2-r:y2+r)-I2_mean;  
        p=sum(sum(a.*b));  
        q=sqrt(sum(sum(a.^2))*sum(sum(b.^2)));  
        R(i,j)=p/q;  
    end  
end  
%===================================  
% 寻找相关性最大的角点对并绘图  
%===================================  
% 构造画布  
canvas=ones(max(r1,r2),c1+c2+100)*255;  
canvas(1:r1,1:c1)=I1;  
canvas(1:r2,c1+101:c1+c2+100)=I2;  
imshow(uint8(canvas));  
hold on  
% Harris角点图  
% for i=1:m  
%     x=coords1(2,i);  
%     y=coords1(1,i);  
%     plot(x,y,'ro');  
% end  
% for i=1:n  
%     x=coords2(2,i);  
%     y=coords2(1,i);  
%     plot(x+c1+100,y,'ro');  
% end  
  
[m,n]=find(R==max(max(R)));% 选取相关系数最大的匹配点  
[number,~]=size(m)  
for i=1:number  
    x1=coords1(2,m(i));  
    x2=coords2(2,n(i));  
    y1=coords1(1,m(i));  
    y2=coords2(1,n(i));  
    line([x1,x2+c1+100],[y1,y2]);%匹配连线  
    plot([x1 x2+c1+100],[y1 y2],'ro');  
end  

效果图
在这里插入图片描述

  • 12
    点赞
  • 87
    收藏
    觉得还不错? 一键收藏
  • 58
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 58
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值