数字图像处理第五章——几何变换与图像配准

数字图像处理—几何变换与图像配准

几何变换改变了图像中像素间的空间关系。可以使图像放大和缩小,可以旋转、移动或用各种方法进行其他扩展。几何变换可用于创建小场景,使之适应从某个重放分辨率到另一个分辨率的数字视频,校正由观察几何变化导致的失真,以及排列有相同场景和目标的多幅图像。

(一)点变换

假设(w,z)和(x,y)是两个空间坐标系统,分别称为输入空间和输出空间。几何坐标变换可定义为输入空间点到输出空间点的映射:
在这里插入图片描述
这里, T{.}叫做正向变换或正向映射。如果 T{.}有逆,可逆映射输出空间点到输入空间点:
在这里插入图片描述
图像的几何变换被定义为按照几何坐标的变换。令f(w,z)表示输入空间的一幅图像,我们可以定义输出空间的变换图像g(x,y)。

图像处理工具箱采用tform 结构来描述几何坐标变换,tform 结构由函数 maketform 创建,语法是:

tform = maketform(transform—type, params, ...)

参量 transform_type 是下列字符串之一:’affine’、’projective’、’custom’、 ‘box’或’composite’。主要讨论‘custom’变换类型,这种变换可以用来创建基于用户定义的几何坐标变换的 tform 结构。'custom’类型的全部语法是:

tform = maketform('custom', ndims_in, ndims_out,... forward_fen, inv_function, tdata)

对于二维几何变换是 ndims_in 和 ndims_out,参数 forward_fen 和 inv_fen 是关于正向和反向空间坐标变换的函数句柄 。参数 tdata 包含 forward_fcn 和所需要的任何额外信息。

接下来实际操作,创建两个描述不同空间坐标变换的 tform 结构。第一个变换用因数3水平地放大,用因数2垂直地放大:
在这里插入图片描述在这里插入图片描述
首先,创建正向函数,语法:

xy = fwd_function (wz,tdata) 

wz是包含两列的矩阵,在 wz 平面中每一行包含一个点;xy是另一个包含两列的矩阵,其中的行是包含在 xy 平面中的点。

 forward_fcn=@(wz,tdata) [3*wz(:,1),2*wz(:,2)]

在这里插入图片描述
接下来,创建具有语法wz = inverse_fen(xy,tdata)的反函数:

inverse_fcn=@(xy,tdata) [xy(:,1)/3,xy(:,2)/2]

在这里插入图片描述
现在,可以构建第一个 tform 结构:

tform1=maketform('custom',2,2,forward_fcn,inverse_fcn,[])

在这里插入图片描述
计算某个点对的正向变换,接下来的反向变换核实了我们得到的原始数据:

WZ=[1 1;3 2];
XY=tformfwd(WZ,tform1)

在这里插入图片描述

WZ2=tforminv(XY,tform1)

在这里插入图片描述

第 2 个变换示例:以垂直坐标因子移动水平坐标,并保持垂直坐标不变。
在这里插入图片描述
在这里插入图片描述
编写代码:

forward_fcn=@(wz,tdata) [wz(:,1)+0.4*wz(:,2),wz(:,2)];
inverse_fcn=@(xy,tdata) [xy(:,1)-0.4*xy(:,2),xy(:,2)];
tform2=maketform('custom',2,2,forward_fcn,inverse_fcn,[]);
XY = tformfwd{WZ, tform2)

在这里插入图片描述

WZ2=tforminv(XY,tform2)

在这里插入图片描述
对应垂直坐标的 xy的第二列在变换中没有变。

为了能对特殊的空间变换的效果有一个较好的感觉,目测变换对在网格上安排一组点的影响是有帮助的。下面的两个自定义 M-函数 pointgrid 和 vistform 可帮助目测检验给定的变换。

vistform(tforml, pointgrid([0 0;100 100])) 
figure, vistform(tform2, pointgrid([0 0;100 100]))

运行效果如下:

如图所示,第一个变换以不同的缩放因子延伸了水平和垂直轴;第二个变换以随垂直坐标变化的数量水平移动点。

(二)仿射变换

对于 2D空间,仿射变换可写成下式:
在这里插入图片描述
为了数学和计算方便,仿射变换可用附加第三坐标的方法写成矩阵相乘形式:
在这里插入图片描述
这个公式还可以写成下式:
在这里插入图片描述
其中,T称为仿射矩阵。在[x y]和[w z]向量上加 1 的符号约定将产生齐次坐标。对应tforml 的仿射矩阵是:
在这里插入图片描述
对应tforml 的仿射矩阵是:
在这里插入图片描述
函数 maketform 语法 tform = maketform(‘affine’, T) 从仿射矩阵直接创建 tform 结构。
编写代码:

T = [1 0 0;0.4 1 0; 0 0 1];
tform3 = maketform('affine', T);
WZ = [1 1; 3 2];
XY = tformfwd(WZ, tform3);

在这里插入图片描述
在这里插入图片描述
重要的仿射变换包括缩放、旋转、平移、裁剪和反射。下面分别介绍这几类:

图像缩放

图像比例缩放是指将给定的图像在x轴方向按比例缩放xf倍,在y轴按比例缩放yf倍,从而获得一幅新的图像。如果fx=fy,即在x轴方向和y轴方向缩放的比率相同,称这样的比例缩放为图像的全比例缩放。如果fx不等于fy,图像的比例缩放会改变原始图象的像素间的相对位置,产生几何畸变。

编写代码:

img1=imread('D:\数字图像处理\第五章学习\dog2.jpg');
se=translate(strel(1),[100 100]);
img2=imresize(img1,0.2,'nearest');
img3=imresize(img1,1.5,'nearest');
figure(1);
imshow(img1),title('(a)原图像');
figure(2);
imshow(img2),title('(b)缩小图');
figure(3);
imshow(img3),title('(c)放大图');

代码运行效果如下:

图像平移

图像平移就是将图像中所有的点都按照指定的平移量水平、垂直移动。

数学理论原理
设图像的高度为H,宽度为W,如下所示:
在这里插入图片描述
图像是由像素组成的,而像素的集合就相当于一个二维的矩阵,每一个像素都有一个“位置”,也就是像素都有一个坐标。假设原来的像素的位置坐标为(x0,y0),经过平移量(△x,△y)后,坐标变为(x1,y1),如下所示:
在这里插入图片描述
用数学式子表示可以表示为:

x1 = x0 + △x,
y1 = y0 + △y;

用矩阵表示为:
在这里插入图片描述
编写代码:

img1=imread('D:\数字图像处理\第五章学习\cat3.jpg');
se=translate(strel(1),[100 100]);
img2=imdilate(img1,translate(strel(1),[-100 -100]));
img3=imdilate(img1,translate(strel(1),[100 -100]));
img4=imdilate(img1,translate(strel(1),[100 100]));
subplot(2, 2, 1),imshow(img1);title('(a)原图像');
subplot(2, 2, 2),imshow(img2);title('(b)左上方平移');
subplot(2, 2, 3),imshow(img3);title('(c)左下方平移');  
subplot(2, 2, 4),imshow(img4);title('(c)右下方平移');  

代码运行效果如下:
在这里插入图片描述
图片镜像变换

图像的镜像变换分为两种:一种是水平镜像,另外一种是垂直镜像。

数学理论原理

图像的水平镜像操作是将图像的左半部分和右半部分以图像垂直中轴线为中心镜像进行对换,示意图如下:

水平镜像中,原图中的(x0,y0)经过水平镜像后,坐标变成了(x0,W-y0),用数学公式表达就是:

x1 = x0;
y1 = W-y0 ;

写成矩阵就是:
在这里插入图片描述
也就是说,水平镜像变幻的矩阵因子为:
在这里插入图片描述
图像的垂直镜像操作是将图像上半部分和下半部分以图像水平中轴线为中心镜像进行对换。示意图如下:

垂直镜像中,原图中的(x0,y0)经过垂直镜像后,坐标变成了(H-x0,y0),用数学公式表达就是:

x1 = H-x0;
y1 = y0 ;

写成矩阵就是:
在这里插入图片描述
也就是说,垂直镜像变换的矩阵因子为:
在这里插入图片描述
编写代码:

img1=imread('D:\数字图像处理\第五章学习\dog6.tif');
tform1=maketform('affine',[-1 0 0;0 1 0;1 0 1]);
img2=imtransform(img1,tform1,'nearest');
tform2=maketform('affine',[1 0 0;0 -1 0;0 1 1]);
img3=imtransform(img1,tform2,'nearest');
subplot(1, 3, 1),imshow(img1);title('(a)原图像');
subplot(1, 3, 2),imshow(img2);title('(b)水平镜像');
subplot(1, 3, 3),imshow(img3);title('(c)垂直镜像');  

代码运行效果如下:
在这里插入图片描述
图像旋转
一般图像的旋转是以图像的中心为原点,旋转一定的角度。

数学理论原理

图像像素原来的坐标为(x0,y0),(顺时针)选择Θ角度后得到(x1,y1),用数学公式表达如下所示:
在这里插入图片描述
在这里插入图片描述
用矩阵表示如下所示:
在这里插入图片描述
编写代码:

img1=imread('D:\数字图像处理\第五章学习\cat2.jpg');
img2=imrotate(img1,270);
img3=imrotate(img1,90);
img4=imrotate(img1,180);
subplot(2, 2, 1),imshow(img1);title('(a)原图像');
subplot(2, 2, 2),imshow(img2);title('(b)旋转270度');
subplot(2, 2, 3),imshow(img3);title('(c)旋转90度');  
subplot(2, 2, 4),imshow(img4);title('(d)旋转180度');  

代码运行效果如下:
在这里插入图片描述
注意:这里主要是说明一下imrotate函数,这个函数就是对图像旋转的函数,输入是图像和旋转的角度,角度为正值时,逆时针旋转;角度为负值时,顺时针选择。

图像的裁剪

有时候我们为了减少图像所占存储空间,舍弃图像的无用部分,只保留感兴趣的部分,则需要用到图像的剪取。

编写代码:

img1=imread('D:\数字图像处理\第五章学习\face.jpg');
img2=imcrop(img1,[100 100 100 100]);  %从坐标(0,0)开始,从原图上剪取一个长度为50,宽度为50的矩形部分
img3=imcrop(img1,[170 200 80 70]);
img4=imcrop(img1,[160 273 100 70]);
subplot(2, 2, 1),imshow(img1);title('(a)原图像');
subplot(2, 2, 2),imshow(img2);title('(b)剪取眼睛部分');
subplot(2, 2, 3),imshow(img3);title('(c)剪取鼻子部分');  
subplot(2, 2, 4),imshow(img4);title('(d)剪取嘴巴部分');  

代码运行效果如下:
在这里插入图片描述
实验结论:图像的放大,缩小,旋转,裁剪等图像几个变换的理论和实验过程已经广泛应用在许多领域,在图像处理中的许多方法和技术,包括图像增强,图像恢复,压缩编码等都以此为基础。但同时MATLAB进行几何变换也存在一些技术局限,如当图像面积太大 ,利用MATLAB实现图像的放大效果不明显,而且运用MATLAB进行裁剪时,要注意裁剪范围坐标是否超出原图像范围。

(三)投影变换

另一种有用的几何变换类型是投影变换,包括在空间情况下的仿射变换的投影变换在一幅 图像的逆透视变换中是很有用的。正如仿射变换那样,这对使用辅助第三维定义二维投影变换很有用。然而,与仿射变换不同,辅助坐标(在下边的公式中用 h来表示)不是常量。
在这里插入图片描述
其中,a11和a23是非零值, 在投影变换中,线映射为线,但是平行线不再保持平行。为了创建投影的 tform 结构,采用带有 maketform 函数的’projective’ 类型,例如:

编写代码:

T = [-2.7390 0.2929 -0.6373 
    0.7426 -0.7500 0.8088 
    2.8750 0.7500 1.0000];
tform = maketform('projective', T);
vistform(tform, pointgrid([0 0; 1 1]));

代码运行效果如下:

左边图为输入空间的点网格,右图为输出空间中变换后的点网格。 输入空间网格中有两组平行线, 一组是水平的,一组是垂直的。
在这里插入图片描述
上图显示了这两组平行线变换到输出空间后的线,在称为尽头点的位置交叉。尽头点位于地平线上,当变换的时候,仅平行于水平线的输入空间的线保持水平,所有的其他平行线变换为在位于地平线上尽头点处交叉的线。

(四)应用于图像的几何变换

图像处理工具箱函数 imtransform 使用逆映射过程把几何变换应用于图像。imtransform 的基本调用语法是:

g = imtransform(f, tform)
T=maketform(transformtype,Matrix);

编写代码:

f = checkerboard(50);
sx = 0.75;
sy = 1.25;
T = [sx 0 0
    0 sy 0
    0 0 1];
t1 = maketform('affine',T);     %创建缩放参数结构体
g1 = imtransform(f, t1);        %实现图像的缩放
theta = pi/6;

T2 = [ cos(theta) sin(theta) 0 
    -sin(theta) cos(theta) 0 
     0 0 1];
 t2 = maketform('affine', T2);    %创建旋转参数结构体
 g2 = imtransform(f, t2);         %实现图像旋转
 
 T3 = [0.4788 0.0135 -0.0009 
     0.0135 0.4788 -0.0009 
     0.5059 0.5059 1.0000]
 tform3 = maketform('projective',T3);
 g3 = imtransform(f, tform3);
 
subplot(2, 2, 1),imshow(f);title('(a)原图像');
subplot(2, 2, 2),imshow(g1);title('(b)仿射缩放变换');
subplot(2, 2, 3),imshow(g2);title('(c)仿射旋转变换');  
subplot(2, 2, 4),imshow(g3);title('(d)投影变换');  

代码运行效果如下:

总的来说,仿射变换可以理解为经过对坐标轴的放缩,旋转,平移后原坐标在在新坐标域中的值。更简洁的说:仿射变换=线性变换+平移。参数transformtype指定了变换的类型,如上面的‘affine’为二维仿射变换,包括平移、旋转、比例、拉伸、错切等;Matrix为相应的仿射变换矩阵。

(五)MATLAB 中的图像坐标系统

像前面显示的许多图没有轴标记,这是函数imshow的默认行为。但是几何图像变换的分析和解释是通过显示这些形象的排列来辅助的。开启标记的一种方法是在调用imshow之后调用axis。例如:

f=imread('D:\数字图像处理\第五章学习\face.jpg');
imshow(f)
axis on
xlabel x
ylabel y

代码运行效果如下:

原点在左上角; X 轴是水平的,并向右延伸; 轴是垂直的, 并向下延伸。用于设置一定的用户参数选择的工具箱函数 iptsetpref 可用于始终产生 imshow 以显示记号标志。为转向带有记号和标记的显示,可调用:

iptsetpref imshowAxesVisible on

XData特性是两元素向量,其中,第一个元素指定像素的第一列中心的 x 坐标,第二个元素指定像素最后一列中心的 x 坐标。类似地,YData 的两个元素指定 了第一行和最后一行中心的y坐标。对于包含M行、 N列的图像来说,默认的XData向量是[1, N], 默认的 YData 向量是[1, M]。

编写代码:

f=imread('D:\数字图像处理\第五章学习\face.jpg');
imshow(f,'XData',[-20,20],'YData',[-10,10])
axis on
xlabel x
ylabel y

代码运行效果如下:

放大图像左上角

axis([8 8.5 0.8 1.1])

用上面命令放大图像左上角之后,发现已不再是方形。

5.1 输出图像位置

函数 imtransform 可以通过使用附加参数来提供输出空间中图像的位置信息。调用语法是:

[g, xdata, ydata] = imtransform(f, tform)

当使用 imshow 显示图像时,第 2个和第 3 个参数可以像XData和 YData 参数那样来使用。

用旋转和平移来研究如何在相同的坐标系统中与输入图像一起显示和定位输出图像,以使用标以记号的轴和标记显示原始图像开始。

编写代码:

f=imread('D:\数字图像处理\第五章学习\cat5.jpg');
imshow(f)
hold on                              %调用hold on,以便后续的绘图或显示命令不清除该图
theta=3*pi/4;  
T=[cos(theta) sin(theta) 0
   -sin(theta) cos(theta) 0
   0           0          1];
tform=maketform('affine',T);
[g,xdata,ydata]=imtransform(f,tform,'FillValue',255);    %imtransform使图像旋转3*pi/4弧度
imshow(g,'XData',xdata,'YData',ydata)
axis auto                            %使用axis函数自动扩展轴的限制,以便两幅图像同时可见
axis on                              %打开标有记号的轴和标记

代码运行效果如下:

在结果中可以看到,仿射变换关于系统坐标原(0,0)旋转图像。 接下来,检验平移,这是比旋转简单的仿射变换。

编写代码:

f=imread('D:\数字图像处理\第五章学习\cat5.jpg');
T=[1 0 0;0 1 0;500 200 1];    %以构成仿射变换tform结构开始,向右移动500,向下移动200
tform=maketform('affine',T);
g=imtransform(f,tform);
imshow(g)

代码运行效果如下:

5.2 控制输出网格

前面说明了如何用 xdata 和 ydata 参数形象化平移的效果,从输出 imtransform 到输 入 imshow。另一个方法是在输出空间中用imtransform 直接控制像素网格。通常,imtransform 在输出空间中用下列步骤定位和计算输出图像:
(1) 决定输入图像的边界矩形。
(2) 在边界矩形上把点变换到输出空间中。
(3) 计算变换后输出空间中点的边界矩形。
(4) 计算位于输出空间中、边界矩形内的网格上的输出图像像素。

如下自定义函数说明了 xdata 和 ydata 参数的使用。这是 imtransform 的另一个变异, 总使用像输出空间矩形那样的输入空间矩形。这样一来,输入和输出图像的位置便可更直接地 进行比较:

function g=imtransform2(f,varargin)
% IMTRANSFORM2 2-D image transformation with fixed output location
% G=IMTRANSFORM2(F,TFORM,...)applies a 2-D geometric
% transformation to an image.IMTRANSFORM2 fixes the output image
% location to cover the same region as the input image.
% IMTRANSFORM2 takes the same set of optional parameter/value
% pairs as IMTRANSFORM.
[M,N]=size(f);
xdata=[1 N];
ydata=[1 M];
g=imtransform(f,varargin{:},'XData',xdata,'YData',ydata);

函数 imtransform2 是封装函数的典型示例。封装函数接受输入,有可能改进它们或把它们相加,然后把它们传递给另一个函数。

针对几个几何变换,比较imtransform 和imtransform2 的输出。

f=imread('D:\数字图像处理\第五章学习\cat5.jpg');
tform1=maketform('affine',[1 0 0;0 1 0;300 500 1]);
g1=imtransform2(f,tform1,'FillValue',200);
h1=imtransform(f,tform1,'FillValue',200);
tform2=maketform('affine',[0.25 0 0;0 0.25 0;0 0 1]);
g2=imtransform2(f,tform2,'FillValues',200);
h2=imtransform(f,tform2,'FillValues',200);
subplot(2, 3, 1),imshow(f);title('(a)原图像');
subplot(2, 3, 2),imshow(g1);title('(b)用函数 imtransform2 平移图像');
subplot(2, 3, 3),imshow(h1);title('(c)用 imtransform 和默认参数平移图像');  
figure;imshow(g2),title('(d)用imtransform2 缩放图像');  
figure;imshow(h2),title('(e)用imtransform和默认参数缩放图像');  

代码运行效果如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
实验结论:从图可以看出(b)显示了使用imtransform2 的结果,与(a)进行比较,可以很容易地 看出平移的效果。注意图 (b),输出图像的一部分已被切掉,而在图( c )中,显示了使用imtransform的结果,全部输出图像是可见的,但是失去了平移效果。两个输出(图 (d)和(e))显示了全部输出图像。从 imtransform2 的输出可以看到,虽然比变换后的图像大,但填充的像素灰度很协调,而来自函数 imtransform 的输出刚好包含变换后的图像。

(六)图像内插

对于数字图像,f的值仅在整数值位置是知道的。使用这些已知的值去估计在非整数值位 置的/是内插的典型示例— —用离散数据构建连续定义的函数。内插具有很长的历史,很多年 来,已经提出了众多的内插方法。在信号处理文献中,内插常常被解释为拥有两个设计步骤的重取样过程:
(1) 把连续变换离散化,把拥有连续域定义的函数尸转换为在离散域定义的函数f。
(2) 在离散位置估计f’的值。
当知道f的取样是有规律的间隔时,这个解释最有用。从离散到连续的变换步骤,可以用缩放和移动过的函数的求和来明确地表达,该函数叫做内插核。

一些常用的内插核:盒状核 h g h_g (x)、三角核 h T ( x ) h_T(x)

盒装核由下式定义:
在这里插入图片描述
三角核由下式定义:
在这里插入图片描述

6.1 二维内插

在图像处理中,最常用的二维内插方法是把问题分成一系列的多个一维内插任务。
在这里插入图片描述
上图说明了使用几个特定值的过程。在这个过程中,f’(2.6,1.4)是由围绕着f(x,y)的样本用一维序列的线性内插得到的:
(1) 用f(2,1)和f(3,1)之间的线性内插决定f’(2.6,1.0)。
(2) 用f(2, 2)和f(3, 2)之间的线性内插决定f’(2.6,2.0)。
(3) 用f’(2.6,1.0)和f’(2.6,2.0)之间的线性内插决定f’(2.6,1.4)。
用一系列的一维线性内插实现二维内插的处理方法被称为双线性内插。类似地,双三次内插是用一系列的一维三次内插完成的。

6.2 内插方法的比较

不同内插方法在计算速度和输出质量方面是不同的。用于说明赞成和反对不同内插方法的经典测试是重复旋转。

针对最近邻、双线性和双三次内插,用 reprotate 比较计算速度和图像质量。 函数连续旋转输入12次,由调用者指定要使用的内插方法。首先,用 timeit 记录每一种方法的时间:

timeit(@() reprotate(f, 'nearest'));

在这里插入图片描述

timeit(@() reprotate(f,'bilinear'));

在这里插入图片描述

timeit(@() reprotate(f,'bicubic'));

在这里插入图片描述
正如预期的那样,最近邻内插最快,双三次内插最慢。

f=imread('D:\数字图像处理\第五章学习\cat5.jpg');
f=rgb2gray(f);
subplot(2, 2, 1), imshow(f);title('(a)原图像');
subplot(2, 2, 2), imshow(reprotate(f,'nearest'));title('(b)最近邻内插');
subplot(2, 2, 3), imshow(reprotate(f,'bilinear'));title('(c)双线性内插');
subplot(2, 2, 4), imshow(reprotate(f,'bicubic'));title('(d)双三次内插');   %必须是灰度图像

实验结论:由图可以看出(b)中的最近邻结果显示出存在很大的“锯齿”边缘失真。( c ) 中的双线性内插结果有较平滑的边缘,但整个外观有点模糊。(d)中的双三次内插看起来最好,比起双线性内插有更平滑的边缘和更少的模糊。注意,对于重复的 12 次旋转,只有图像中心处的像素仍属于非边界像素。保留的像素是黑色的。

(七) 图像配准

几何变换最重要的图像处理应用之一是图像配准。图像配准方法寻求对准两幅或多幅相同场景的图像。例如,可能是对准不同时间获取的图像,计量的时差可能是一个月或一年。在同时获取多幅图像时,会有不同的情节发生,但采用不同的手段。例如,为了测量场景 深度,在不同位置的两台摄像机可能同时获取相同场景同时发生的图像。有时,图像来自不同的设备。两幅卫星图像可能在分辨率和空间特性上都不同。 在这种情况下,目标常常是把个别的图像融合为单一图像以增强图像的可视性。

7.1 配准处理

图像配准方法通常由下列基本步骤组成:
(1) 检测特征
(2) 匹配相应的特征
(3) 推断几何变换
(4) 通过几何变换用另一幅图像对准一幅图像
一幅图像的特征可以是图像的任何部分,可以是两幅图像中潜在的、可识别和可定位的部 分。例如,特征可以是点、线或角。一旦选择了特征,就要匹配特征。图像配准方法可以是手工的或自动 的,这取决于特征检测和配准是由人辅助的还是用自动算法执行。

7.2 使用 cpselect 的手工特征选择和匹配

图像处理工具箱为图像特征使用“控制点”这一术语。工具箱为手工选择和匹配被配准的 一对图像的相应控制点提供了名为控制点选择工具(cpselect)的GUI (图形用户界面)。把被对 准图像的文件名作为输入参量发送到 cpselect, 例如:

cpselect('D:\数字图像处理\第五章学习\cat5.jpg’ , 'D:\数字图像处理\第五章学习\cat.jpg') 

作为另一选择,也可以首先把图像读进 MATLAB变量,然后再传送给 cpselect:

f=imread('D:\数字图像处理\第五章学习\cat5.jpg');
g = imread('D:\数字图像处理\第五章学习\cat.jpg');
cpselect(f, g)

cpselect工具可帮助在大图像中导航(放大、摇镜头和滚动),可以选择特征(控制点),并用鼠标在图像上点击以与其他控制点配对。

代码运行效果如下:
在这里插入图片描述

7.3 使用 cp2tform 推断变换参数

一旦特征对被识别和匹配,图像配准处理的下一步就是确定几何变换函数。通常是首先选 择某个特定的变换模型,然后估计必需的参数。例如,可能决定某个仿射变换是合适的,并且 用相应的特征对推导仿射变换矩阵。图像处理工具箱为从特征对推断几何变换参数提供了函数 cp2tforrrio cp2tform 的语法是:

tform = cp2tform (input—points, base_points, transformtype)

参数 input_points 和 base_points 是两个PX2大小的包含相应特征位置的矩阵。

7.4 基于区域的配准

对于外在特征选择和匹配的可供选择的方法是基于区域的配准。在基于区域的配准中,称作模板图像的一幅图像被移动以覆盖第二幅图像的每个位置。在每个位置,计算基于区域的相似性度量。如果在相似性度量中,在某个特定位置找到明显的峰值,就可以说模板图像在第二幅图像的某个特定位置匹配。 使用函数 normxcorr2 在图像中定位模板,调用语法是:

g = normxcorr2(template, f)
f=rgb2gray(imread('D:\数字图像处理\第五章学习\cat5.jpg'));
w = rgb2gray(imread('D:\数字图像处理\第五章学习\cat.jpg'));
g = normxcorr2(w, f);
subplot(1, 3, 1), imshow(f);title('(a)原图像');
subplot(1, 3, 2), imshow(w);title('(b)模板');
subplot(1, 3, 3), imshow(abs(g));title('(c)归一化相关的绝对值');

在这里插入图片描述
实验结论:这个例子使用 normxcorr2 在模板和图像之间寻找最好匹配的位置。首先,读入模板和图像,然后使用 normxcorr2 计算和显示归一化互相关,图( c )显示了归一化互相关图像,最亮的点,该点指出了图像和模板之间的匹配。 除了归一化互相关外,近几年来,在图像处理文献中还提出了许多其他基于区域的相似性 度量。例如平方差的和、绝对差的和。不同的度量,因素也不同。在简单的情况下,用归一化互相关或其他相似性度量的模板匹配也可用于匹配两幅重叠的图像。

猜你喜欢

转载自blog.csdn.net/Dujing2019/article/details/89429880