图像的几何失真校正
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
图像的几何失真校正专业班级:10 信息安全学生姓名:王猛涛学生学号:_ 20101616310049 _ 指导教师:姚孝明完成时间:2021年3月4日
数字图像处理
实验八:图像的几何失真校正
一、实验目的
1. 熟练掌握MATLAB图像处理工具箱中的imresize函数与imrotate函数。
2. 根据自己编写的程序,选定图像进行放大或缩小,进一步理解图像缩小、放大与旋转操作的原理。
二、实验主要仪器设备
1. 微型计算机:Intel Pentium及更高。
2. MATLAB软件(含图像处理工具箱)。
三、实验原理
1. imresize函数
imrersize函数使用由参数method指定的插值运算来改变图像的大小。
method的几种可选值:
'nearest'(默认值)最近邻插值
'bilinear'双线性插值
'bicubic'双三次插值
B = imresize(A,m)表示把图像A放大m倍
B = imresize(...,method,h)中的h可以是任意一个FIR滤波器(h通常由函数ftrans2、fwind1、fwind2、或fsamp2等生成的二维FIR滤波器)。
2. imrotate函数
函数功能:对进行旋转操作。
在matlab命令窗口中键入help imrotate 或doc imrotate或lookfor imrotate可以获得该函数帮助信息。
调用格式:
B = imrotate(A,angle)
将图像A(图像的数据矩阵)绕图像的中心点旋转angle度,正数表示逆时针旋转,负数表示顺时针旋转。
返回旋转后的图像矩阵。
以这种格式调用该函数,该函数默认采用最近邻线性插值(Nearest-neighbor interpolation)。
旋转后的图像超出的部分填充0(黑色)。
B = imrotate(A,angle,method)
使用method参数可以改变插值算法,method参数可以为下面这三个值:
{'nearest'}:最邻近线性插值(Nearest-neighbor interpolation)
'bilinear':双线性插值(Bilinear interpolation)
'bicubic':(或叫做双立方插值)(Bicubic interpolation)
B = imrotate(A,angle,method,bbox)
bbox参数用于指定输出图像属性:
'crop':通过对旋转后的图像B进行裁剪,保持旋转后输出图像B的尺寸和输入图像A的尺寸一样。
{'loose'}:使输出图像足够大,以保证旋转后超出范围的像素值没有丢失。
一般上这种格式产生的图像的尺寸都要大于源图像的尺寸。
3. 最近邻插值算法
最简单的插值法是最近邻插值法,也叫零阶插值法。
即选择离它所映射到的位置最近的输入像素的灰度值为插值结果。
对二维图像,是取待测样点周围4 个相邻像素点中距离最近1 个相邻点的灰度值作为待测样点的像素值。
若几何变换后输出图像上坐标为(x′,y′)的对应位置为(m,n)。
4. 双线性插值算法
双线性插值又叫一阶插值法,它要经过三次插值才能获得最终结果,是对最近邻插值法的一种改进,先对两水平方向进行一阶线性插值,然后再在垂直方向上进行一阶线性插值。
插值算法所应用的领域较多,对图像进行缩放处理是比较典型的应用,由于图像像素的灰度值是离散的, 因此一般的处理方法是对原来在整数点坐标上的像素值进行插值生成连续的曲面, 然后在插值曲面上重
新采样以获得缩放图像像素的灰度值。
缩放处理从输出图像出发,采用逆向映射方法,即在输出图像中找到与之对应的输入图像中的某个或某几个像素,采用这种方法能够保证输出图像中的每个像素都有一个确定值,否则,如果从输入图像出发来推算输出图像,输出图像的像素点可能出现无灰度值的情况。
因为,对图像进行缩放处理时输出图像像素和输入图像之间可能不再存在着一一对应关系。
四、实验内容
1. 自选图像练习使用MATLAB图像处理工具箱中的imresize函数与imrotate函数。
2. 自选图片,按隔行(列)采样的方法,编写缩小1/4的程序。
3. 编写放大长宽各1.5倍的程序,分别采用最小近邻插值法与双线性插值
法。
五、实验结果与分析
1. imresize函数与imrotate函数的使用
选定图片football_iverse.jpg,调用函数imresize与imrotate(详见程序附录
一),得到如下结果(如下图1所示):
原始图像
将原图像缩小0.5倍
将原图像放大1.5倍
观察发现:图像出现了"马赛克"现象
逆时针旋转45度后的图像
图 1 调用函数imresize与imrotate运行结果截图
2.自选图片,按隔行(列)采样的方法,编写缩小1/4的程序。
本次选定图片cameraman.tif(256*256),先隔行抽样,图像大小变为128*256(缩小为原来的1/2),再隔列取样,图像大小由128*256再变为128*128(缩小为原来的1/4)。
根据上述思路,我们编写相应的MATLAB程序(具体见附录二),运行后结果如下(见下图2所示)。
原始图像
隔行采样后的结果
再隔列采样后的结果
图 2 图像采样结果
3.编写放大长宽各1.5倍的程序,分别采用最小近邻插值法与双线性插值法。
(1)最小近邻插值法
根据前面提到的最小近邻插值法的原理,我们将扩大的图像的像素值反映射回原来的图像,找出对应的像素点(可能为分数点),将对应分数点上的像素值填充到扩大的图像中。
确定分数点的灰度值:从分数点四周的四个整数点中,选择距离分数点最近的整数点的值作为分数点的灰度值。
由上编写相应的MATLAB程序(详见附录三),运行后所得结果如下(如下图3
所示):
原始图像
最小近邻插值后的图像
长和宽各放大为原来的1.5倍
图 3 最小近邻插值结果(放大后图像出现了模糊的“马赛克”现象)(2)双线性插值法
依据前面所述的双线性插值法的原理,我们将扩大的图像的像素值反映射回原来的图像,找出对应的像素点(可能为分数点),将对应分数点上的像素值填充到扩大的图像中。
确定分数点的灰度值:用分数点周围4个邻点的灰度值加权内插作为灰度校正值。
根据上述思路,编写相应的MATLAB程序(详见附录四),运行后所得结果如下(如下图4所示):
原始图像
双线性插值法扩大后的图像
图像中出现了模糊的"马赛克"现象
图 4 双线性插值法处理后的结果
4. 结果分析
做完上述实验,我们通过分析对比,得到如下结论:
1)MATLAB图像处理工具箱中的imresize函数和imrotate函数可以较为方便地对图像进行放大、缩小、旋转等多种处理操作。
2)图像经过几何位置校正后,在校正空间中各像素点的灰度值等于被校正图像对应点的灰度值,而某些像素点可能分布不均匀,不会恰好落在坐标点上。
最近邻点法和双线性插值法可以很好的解决非整数点灰度值的校正。
3)与最近邻点法相比,双线性插值法几何校正灰度是连续的(与imresize 函数结果比较接近),但计算量较大,并且图像轮廓也会较为模糊,会出现比最小近邻插值法更强的“马赛克”效应。
附录:
附录一:
%调用MATLAB图像处理工具箱中的imresize函数和imrotate函数对图像进行缩小、放大、%旋转变换
clc,clear all
I=imread('football_iverse.jpg');
figure,imshow(I);
title('原始图像');
J=imresize(I,0.5);
P=imresize(I,1.5);
figure,imshow(J);
title('将原图像缩小0.5倍');
figure,imshow(P);
title('将原图像放大1.5倍');
xlabel('观察发现:图像出现了"马赛克"现象');
Q=imrotate(I,45);
figure,imshow(Q);
title('逆时针旋转45度后的图像');
附录二:
%对图像进行隔行隔列采样,把原图像缩小为原图像的1/4
clc,clear all
I=imread('cameraman.tif');
s=size(I);
J=zeros(s(1)/2,s(2));
%隔行采样
for i=1:s(1)/2
for j=1:s(2)
if mod(i,2)~=0
J(i,j)=I(2*(i-1)+1,j);
else
J(i,j)=I(2*i-1,j);
end
end
end
%隔列采样
T=zeros(s(1)/2,s(2)/2);
for i=1:s(1)/2
for j=1:s(2)/2
if mod(j,2)~=0
T(i,j)=J(i,2*(j-1)+1);
else
T(i,j)=J(i,2*j-1);
end
end
end
figure,imshow(uint8(I));title('原始图像');
figure,imshow(uint8(J));title('隔行采样后的结果'); figure,imshow(uint8(T));title('再隔列采样后的结果'); 附录三:
%最小近邻插值法
clc,clear all
I=imread('tire.tif');
s=size(I);
m=1.5*s(1);
n=1.5*s(2);
J=zeros(m,n);
for i=1:m
for j=1:n
J(i,j)=I(round(i/1.5),round(j/1.5));
end
end
figure,imshow(I);title('原始图像');
百度文库- 好好学习,天天向上figure,imshow(uint8(J));title('最小近邻插值后的图像'); xlabel('长和宽各放大为原来的1.5倍');
附录四:
%双线性插值法
clc,clear all
I=imread('cameraman.tif');
s=size(I);
m=1.5*s(1);
n=1.5*s(2);
J=zeros(m,n);
for i=1:m-1
for j=1:n-1
p=abs(i/1.5-round(i/1.5));
q=abs(j/1.5-round(j/1.5));
J(i,j)=(1-p)*(1-q)*I(round(i/1.5),round(j/1.5))+...
p*(1-q)*I(round(i/1.5),round(j/1.5))+...
(1-p)*q*I(round(i/1.5),round(j/1.5)+1)+...
p*q*I(round(i/1.5),round(j/1.5)+1);
end
end
figure,imshow(I);title('原始图像');
figure,imshow(uint8(J));title('双线性插值法扩大后的图像'); xlabel('图像中出现了模糊的"马赛克"现象');
-10。