十一、数字图像处理之几何变换(2)

(六)Matlab中的图像坐标系统

在考虑几何变换的其他情况之前,首先要用matlab显示图像坐标。开启标记的一种方法是在调用imshow之后调用axis。
代码如下:

f = imread('C:\Users\Public\Pictures\Sample Pictures\timg.jpg');
imshow(f);
axis on   %打开标有记号的轴和标记
xlabel x    %给x轴标记上“x”
ylabel y     %给y轴标记上“y”

在这里插入图片描述
用iptsetpref可以用来设置一定的用户参数,始终产生imshow以显示记号标志,也可以为转向带有记号和标记的显示:

iptsetpref imshowAxesVisible on

还可以设置X轴和Y轴的范围值:

imshow(f,'XData',[-20 20],'YData',[-10 10]);

在这里插入图片描述

(1)输出图像位置

用函数imtransform可以显示输出空间中图像的位置,或者其他有关的信息,语法如下:

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

实验代码:

theta = 3*pi/4;
T = [cos(theta) sin(theta) 0;-sin(theta) cos(theta) 0;0 0 1];   %旋转模板
tform = maketform('affine',T);    %构成仿射tform结构
[g,xdata,ydata] = imtransform(f,tform,'FillValue',255);  %'FillValue'指定用于任何输出图像像素的值,对应输入图像边界外的输入空间位置。默认值是0
subplot(121),imshow(g),title(' 旋转后的图像');

T = [1 0 0;0 1 0;500 200 1];     %平移模板
tform = maketform('affine',T);        %构成仿射tform结构
[g1,xdata,ydata] = imtransform(f,tform,'FillValue',255); 
subplot(122),imshow(g1),title(' 平移后的图像');  %向右移动500,向下移动200

效果图如下:
(图一)
在这里插入图片描述

axis auto %自动地扩展轴的限制

(图二)
在这里插入图片描述

结论:图一和图二看出,此命令(axis auto)让坐标轴扩展。

其他图像显示的命令:

hold on %用于显示后续的图,且不清除前面的绘图
axis auto %自动地扩展轴的限制

(2)控制输出网格

imtransform在输出空间中用下列步骤定位和计算输出图像:

  1. 决定输入图像的边界矩形
  2. 在边界矩形上把点变换到输出空间中
  3. 计算变换后输出空间中点的边界矩形
  4. 计算位于输出空间中、边界矩形内的网格上的输出图像像素

实验代码编写如下:

f = imread('C:\Users\Public\Pictures\Sample Pictures\Fig0513(a).tif');
subplot(131),imshow(f),title(' 原图像');
tform1 = maketform('affine',[1 0 0;0 1 0;300 500 1]);
g1 = imtransform2(f,tform1,'FillValue',200);
h1 = imtransform(f,tform1,'FillValue',200);
subplot(132),imshow(g1),title(' 用imtransform2平移图像');
subplot(133),imshow(h1),title(' 用imtransform和默认平移图像');

实验结果如下:
在这里插入图片描述

若改为彩色图像呢?代码如下:

f = imread('C:\Users\Public\Pictures\Sample Pictures\002239D24-13.jpg');
subplot(131),imshow(f),title(' 原图像');
tform1 = maketform('affine',[1 0 0;0 1 0;300 200 1]);    
g1 = imtransform2(f,tform1,'FillValue',200);
h1 = imtransform(f,tform1,'FillValue',200);
subplot(132),imshow(g1),title(' 用imtransform2平移图像');
subplot(133),imshow(h1),title(' 用imtransform和默认平移图像');

在这里插入图片描述

结论: 这个函数不用变换成灰度图像就可以使用。原图像和用imtransform平移后的图像好像是没有变换的,使用imtransform的结果是将全部输出图像可见的。用imtransform2平移后的坐标轴会变化,而且会截取一部分图像,并不会完全显示出来。

(七)图像内插

在信号处理文献中,内插常常被解释为拥有两个设计步骤的重取样过程:

  1. 把连续变换离散化,把拥有连续域定义的函数f’转换为在离散域定义的函数f。
  2. 在离散位置估计f’的值。
    通俗来说,内插是图像放大、收缩、旋转等任务中广泛采用的基本工具(图像重采样),例如由已知像素灰度估计未知位置的像素灰度。

常用的内插方式有:最近邻内插法、双线性内插法、双三次内插法。

  • 最邻近内插值即是选取一个最靠近的像素为它的像素值。

  • 双线性内插值(本质上不是线性),考虑了周围四个点的坐标,最核心的理解同一段直线上两个的像素值对中间点像素值的贡献权重。

  • 双三次内插值考虑的是周围16个像素的像素值,其权重因子的计算比较复杂。

(1)二维内插

最常用的方法是,把问题分成一系列的多个一维内插任务。
如图所示,
在这里插入图片描述

双线性内插的步骤过程是:

  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)。

(2)内插方法的比较

不同内插方法在计算速度和输出质量方面是不同的,用 reprotate 比较计算速度和图像质量,并使用 timeit 记录每一种方法的时间。下面用代码来比较三种内插方式的优劣:

f = imread('C:\Users\Public\Pictures\Sample Pictures\Fig0219(a).tif');
timeit(@() reprotate(f,'nearest'))   %最近邻内插法
timeit(@() reprotate(f,'bilinear'))   %双线性内插法
timeit(@() reprotate(f,'bicubic'))   %双三次内插法
subplot(131),imshow(reprotate(f,'nearest')),title(' 最近邻内插法图像');
subplot(132),imshow(reprotate(f,'bilinear')),title(' 双线性内插法图像');
subplot(133),imshow(reprotate(f,'bicubic')),title(' 双三次内插法图像');

显示的效果如下:
(最近邻内插法)
在这里插入图片描述
(双线性内插法)
在这里插入图片描述
(双三次内插法)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
结论:
使用 timeit 记录以上三种方法的时间可知,双三次内插法的计算速度比前两种方法都要快;用reprotate来比较图像的质量可知,上述两幅图对比,最近邻内插法会出现锯齿状的边缘失真,强化边缘细节;双线性内插法的结果有平滑的边缘,但会模糊图像,有些细节无法辨识;双三次内插法看起来比前面两种效果更好,虽然有平滑的边缘,但也会模糊图像。总而言之三幅图相对比,双三次内插法比最近邻和线性内插法要好一点,视觉效果好一些。

(八)图像配准

说明:图像配准方法寻求对准两幅或多幅相同场景的图像。在同时获取多幅图像时,会有不同的情节发生,也会采用不同的手段。图像还可能来自不同的设备,其分辨率和空间特性都有所不同。在这些情况下,合并这些图像要求对由摄像机角度距离传感器分辨率和其他因素导致的几何失常进行校正。目前,还没有找到一种普适的方法能够应对所有的配准情况,任何一种配准算法都必须考虑图像的成像原理、几何变形、噪声影响、配准精度等因素。

图像配准的方法迄今为止,在国内外的图像处理研究领域,已经报道了相当多的图像配准研究工作,产生了不少图像配准方法。总的来说,各种方法都是面向一定范围的应用领域,也具有各自的特点。比如计算机视觉中的景物匹配和飞行器定位系统中的地图匹配,依据其完成的主要功能而被称为目标检测与定位,根据其所采用的算法称之为图像相关等等。(来自百度百科)

(1)图像配准步骤

  1. 检测特征;
  2. 匹配相应的特征;
  3. 推断几何变换;
  4. 通过几何变换用另一幅图像对准一幅图像

(2)使用cpselect的手工特征选择和匹配

图像特征也称为“控制点”,在matlab中使用cpselect来对图像和模板进行匹配。调用如下:

cpselect('C:\Users\Public\Pictures\Sample Pictures\Fig0518(a).tif','C:\Users\Public\Pictures\Sample Pictures\Fig0518(b).tif');
或者
f = imread('C:\Users\Public\Pictures\Sample Pictures\Fig0518(a).tif');
g = imread('C:\Users\Public\Pictures\Sample Pictures\Fig0518(b).tif');
subplot(121),imshow(f);
subplot(122),imshow(g);
cpselect(f,g);

实验效果图:
在这里插入图片描述

cpselect工具可以用来在大图像中进行放大滚动切换镜头选择控制点,并用鼠标在图像上点击以与其他控制点进行配对

(3)使用cp2tform推断变换参数

一旦特征被识别和匹配,下一步就要确定几何变换函数了,需要首先选择某个特定的变换模型,然后估计必需的参数。在matlab中提供了函数cp2tform用于从特征中推断几何变换的参数。基本语法如下:

tform = cp2tform(input_points,base_points,transformtype);

其中,input_points和base_points是两个P×2大小的包含相应特征位置的矩阵,transformtype是指定所希望的变换类型的字符串。(函数maketform用于直接指定变换参数 ,cp2tform用于相应特征位置对估计变换参数)

实验代码:

tform = cp2tform(movingPoints,fixedPoints,'affine');     %求出投影变化的矩阵
Iout=imtransform(f,tform);
subplot(121),imshow(Iout);
subplot(122),imshow(g);

实验结果:

在这里插入图片描述

根据之前得到的控制点对坐标,利用cp2tform函数可以计算变换的参数。将基准点对作为输入传递给cp2tform,选择一种适当的变换类型,cp2tform函数就能确定该类型变换所需的参数,实际上相当于一种数据拟合。cp2tform函数寻找能够拟合控制点对的变换参数,返回一个TFORM的结构的几何变换结构。

注意: 若是选择点没有选择正确,则会出现如下的提示。
在这里插入图片描述
(推断仿射变换需要至少3个非共线点)只有选择点满足上面三个非共线点才可以创建tform结构。

(4)观察对准的图像

经过上面的过程,下一步就是显示两幅图像,也可以半透明地在另一幅图像上显示一幅图像。我们可以用自定义函数visreg自动处理这些细节,以便容易观看这两幅配准的图像:

function h = visreg(fref,f,tform,layer,alpha)
if nargin < 5
    alpha = 0.5;
end
if nargin < 4
    layer = 'top';
end
[g,g_xdata,g_ydata] = imtransform(f,tform);
[M,N] = size(fref);
fref_xdata = [1 N];
fref_ydata = [1 M];

if strcmp(layer,'top')
    top_image = g;
    top_xdata = g_xdata;
    top_ydata = g_ydata;
    top_alpha = imtransform(alpha*ones(size(f)),tform);
    bottom_image = fref;
    bottom_xdata = fref_xdata;
    bottom_ydata = fref_ydata;
    
    top_image = fref;
    top_xdata = fref_xdata;
    top_ydata = fref_ydata;
    top_alpha = alpha;
    
    bottom_image = g;
    bottom_xdata = g_xdata;
    bottom_ydata = g_ydata;
end

h_bottom = imshow(bottom_image,'XData',bottom_xdata,'YData',bottom_ydata);
hold on
h_top = imshow(top_image,'XData',top_xdata,'YData',top_ydata);
set(h_top,'AlphaData',top_alpha);
axis auto

if nargout > 0
    h = [h_bottom,h_top];
end

实验代码:

fref = imread('C:\Users\Public\Pictures\Sample Pictures\Fig0518(a).tif');
f = imread('C:\Users\Public\Pictures\Sample Pictures\Fig0518(b).tif');
cpselect(f,fref);
save cpselect;    %这一步是保存文件用的,matfile这个文件不是以我们常规的方式保存的!
s = load('cpselect');
cpstruct = s.cpselect;
tform = cp2tform(cpstruct,'affine');
visreg(fref,f,tform,axis([1740 2660 1710 2840]))

注意: load函数是加载数据文件的命令,数据文件cpselect-results应是.mat文件,你要先用cpselect(f,fref)选择点,再保存为cpselect-results.mat,之后,才能用load加载。所以,在你没做这一步时,红线这句是没法执行的,会出错误提示。save cpselect要用这种方式来产生**.mat文件**。

(5)基于区域的配准

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

g = normxcorr2(template,f)   %可用于定位模板或者配准因为平移而不同的两幅图

实验代码:

f = imread('C:\Users\Public\Pictures\Sample Pictures\Fig0520(a).tif');
w = imread('C:\Users\Public\Pictures\Sample Pictures\Fig0305(a).tif');
g = normxcorr2(w,f);    %互相关量最大值位置配准
imshow(abs(g))

gabs = abs(g);
[ypeak,xpeak] = find(gabs == max(gabs(:)));
ypeak = ypeak-(size(w,1)-1)/2;     %y方向上配准
xpeak = xpeak-(size(w,2)-1)/2;     %x方向上配准
imshow(f)
hold on
plot(xpeak,ypeak,'wo')

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

f1 = imread('C:\Users\Public\Pictures\Sample Pictures\Fig0521(a).tif');
f2 = imread('C:\Users\Public\Pictures\Sample Pictures\Fig0521(b).tif');
w = imread('C:\Users\Public\Pictures\Sample Pictures\Fig0305(a).tif');
g1 = normxcorr2(w,f1);
g2 = normxcorr2(w,f2);
[y1,x1] = find(g1 == max(g1(:)));
[y2,x2] = find(g2 == max(g2(:)));
delta_x = x1 - x2
delta_y = y1 - y2
tform = maketform('affine',[1 0 0;0 1 0;delta_x delta_y 1]);
visreg(f1,f2,tform)

在这里插入图片描述垂直方向平移了81个像素。
在这里插入图片描述水平方向没有发生改变。
在这里插入图片描述
结论:上图显示了配准后的图像。这幅图显示车辆向前运动的轨迹,重叠部分左边很好的对准了,但右边并没有完全对准。这是两幅图间由于平移产生特征不完全一致的效果。图像配准就是指同一目标的两幅或者两幅以上的图像在空间位置的对准

(6)基于特征的自动配准

说明:上面所说的方法部分进行手动处理,一种广泛应用的方法包含用特征检测器在两幅图像中选择大量的潜在可匹配的特征点,这种检测器是Harris角检测器
有以下两种方式
半自动配准: 人机交互方式提取特征(如角点),然后利用计算机对图像进行特征匹配、变换和重采样。
自动配准: 计算机自己完成。基于灰度或者是基于特征。

基于特征的自动配准原理:

  • 基于特征的配准方法不是直接利用图像像素值,而是通过像素值导出的符号特征(特征点,特征线段等)来实现图像匹配,所以它对于对比度和明显的图像特征用于一种特定的配准定位算法中有很重要的实践意义,因为图像的特征往往决定哪类图像能用该特定配准定位算法进行配准定位,通常是采用自动完成或者手动完成。对于许多图像的配准定位来说,这是个很严重的缺陷,因为图像配准定位的精确件与空间坐标的初始选择密切相关。
  • 点特征是图像的一种基本特征,从待配准图像中精确地提取点特征,可以将图像间的配准转化为2个特征点集的匹配。常用的特征点包括边缘点、角点、直线交叉点和高曲率点等。

Harris角检测器的算法思想为:

角点原理来源于人对角点的感性判断,即图像在各个方向灰度有明显变化。这个算法是利用局部窗口在图像上进行移动判断灰度发生较大的变化,所以此窗口用于计算图像的灰度变化为:[-1,0,1;-1,0,1;-1,0,1] [-1,-1,-1;0,0,0;1,1,1]。通俗来说,就是当在图像灰度级发生很大变化的时候,就存在了角点;若灰度级变化不是很大,则就没有存在角点。而这种算法就是以灰度级变化来检测没有特征发生变化。

(7)应用

  1. 配准车牌
  2. 相片校正
  3. 人脸匹配,等等。
  • 1
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值