数字图像处理高级应用:基于MATLAB与CUDA的实现(第2版) (精通MATLAB)
上QQ阅读APP看书,第一时间看更新

1.2 从向量相关角度实现图像匹配

1.2.1 基于相关运算图像匹配的过程

基于相关运算的图像匹配技术可以直接用于在一幅图像中寻找某个子图,并确定子图的位置。对于大小为M×N的图像fx,y)和大小为J ×K的子图模板wx,y),fx,y)与wx,y)的相关运算可以表示为:

其中,x=1,2, …,NK+1,y=1,2, …,MJ+1。子图模板wx,y)的原点设置在子图像的左上角。

计算相关cx,y)的过程就是在图像fx,y)中逐点地移动子图像wx,y),使wx,y)的原点和图像fx,y)中点(x,y)重合,然后计算wx,y)与fx,y)中被wx,y)覆盖的图像区域对应像素的乘积之和,以此计算结果作为相关图像cx,y)在点(x,y)处的响应。

相关可用于在图像fx,y)中找到与子图像wx,y)匹配的所有位置。实际上,当wx,y)按照上述描述的过程移过整幅图像fx,y)之后,最大的响应点(x0,y0)即为最佳匹配的左上角点。也可以设定一个阈值T,认为响应值大于该阈值点的均是可能匹配的位置。

1.2.2 在向量空间分析图像相关匹配

相关的计算是通过将图像元素和子模式图像元素联系起来获得的,将相关元素相乘后再累加。完全可以将子图像wx,y)视为一个按行或按列存储的向量,将计算过程中被wx,y)覆盖的图像区域视为另一个按照同样方式存储的向量。这样一来,相关运算就成了向量之间的点积运算。

两个向量的点积为:

其中,θ为向量之间的夹角。显然,当具有完全相同的方向(平行)时,cosθ=1,从而式(1.2.1)取得其最大值,这就意味着当图像的局部区域类似于子图像模式时,相关运算产生最大的响应。然而,式(1.2.1)最终的取值还与自身的模有关,这将导致式(1.2.1)计算的相关响应存在着对fx,y)和wx,y)的灰度幅值比较敏感的缺陷。这样一来,在fx,y)的高灰度区,可能其内容与子图像wx,y)的内容并不相近,但由于自身较大而产生一个很高的响应。可通过对向量以其模值来归一化解决这个问题,即通过式(1.2.2)来计算。

1.2.3 基于向量相关的图像匹配的MATLAB实现

【例1.2.1】 实现基于向量相关的图像匹配。

        *********************************************************************
        function Icorr= imcorr(I, w)
        % 功能:实现基于向量相关的图像匹配
        % 输入:I——输入的图像
        %      w——模板图像
        % 输出:Icoor——相关系数矩阵
        if nargin~= 2                     %检查输入的个数是否正确
            error('请输入两幅图像 ')
        end
        if size(I,3)== 3                  %检查图像是否是灰度图像,如果是RGB图像,则将其
                                           %转换成灰度图像
            I = rgb2gray(I);
        end
        if size(w,3)== 3
            w = rgb2gray(w);
        end
        [m, n]=size(I);
        [m0, n0]=size(w);
        Icoor=zeros(m-m0+1, n-n0+1);      %为相关系数图像分配空间,以提高运算效率
        vecW=double(w(:));                 %按列存储为向量
        normW=norm(vecW);                  %对应的向量模
        for ii=1:m-m0+1
            for jj=1:n-n0+1
                subMat=I(ii:ii+m0-1, jj:jj+n0-1);
                vec=double(subMat(:));     %按列存储为向量
                Icorr(ii, jj)=vec'*vecW/(norm(vec)*normW+eps);   %计算当前位置的相关系数
            end
        end
        %找出最大响应位置
        [iMaxRes, jMaxRes]=find(Icorr==max(Icorr(:)));
        figure,
        imshow(I)
        hold on
        for ii=1:length(iMaxRes)
            plot(jMaxRes(ii), iMaxRes(ii), '* ');
            %用矩形框标记出匹配区域
            plot([jMaxRes(ii), jMaxRes(ii)+n0-1], [iMaxRes(ii), iMaxRes(ii)]);
            plot([jMaxRes(ii)+n0-1, jMaxRes(ii)+n0-1], [iMaxRes(ii), iMaxRes(ii)+m0-1]);
            plot([jMaxRes(ii), jMaxRes(ii)+n0-1], [iMaxRes(ii)+m0-1, iMaxRes(ii)+m0-1]);
            plot([jMaxRes(ii), jMaxRes(ii)], [iMaxRes(ii), iMaxRes(ii)+m0-1]);
        *********************************************************************