西安交大数字图像处理第一次作业 下载本文

(4)结果分析:最近邻插值、双线性插值与双三次差值这三种方法之间的区别主要在于点周围像素序列的取法不同。对于最近邻插值,输出像素的值指定为点所属像素的值,不考虑 其他像素;对于双线性插值,输出图像的值是最近的2*2邻域内像素值得加权平均值;对于双三次差值,输出图像的值是最近的4*4邻域内像素值得加权平均值。所以,双线性插值法花费的时间比最近邻法的要长一些,而双三次法花费的时间比双线性法的又要长一些。但 是,参与计算的时间越多,计算结果越精确,通常双线性插值和双三次差值这两种方法比最近邻法得到的效果更好。从得到的图像我们可以看到,最近邻内插产生了最大的锯齿边缘,尤其是在对应图像中的肩膀的边缘部位,产生了很明显的锯齿,而双线性内插得到了明显改进的结果使用双三次内插产生了稍微清晰一些的结果。

5.把lena和elain图像分别进行水平shear(参数可设置1.5,或者自行选择)和旋转30度,并采用近邻、线性和双三次插值法zoom到2048*2048。

(1)问题分析:采用仿射变换来进行水平裁剪。仿射变换是空间直角坐标变换的一种,它是一种二维坐标到二维坐标的线性变换,即用图像的矩阵去乘仿射变换的矩阵T,把图像上的像素重新定位到一个新位置,并为这些新位置赋灰度值,而这个任务可以用灰度内插的方法完成,选择最近邻内插法、双线性插值法和双三次插值法三种方法。对于水平偏移变换,运算后,坐标变为 x=v,y=shv+w。在本题中, 参数shv根据题中要求设为 1.5。 对于旋转变换,运算后,坐标变为 x=vcosθ- wsinθ ,y=vsinθ+wcosθ 。在本题中,运用旋转函数,就不在程序中重新设置矩阵值了,而是函数根据参数自行设置矩阵T ;使用 imrotate 函数旋转图像。该函数接受两个主要的变量,即要旋转的图像和旋转的角度,旋转角度的单位为度。如果指定一个正值,imrotate 函数按逆时针方向旋转函数;如果指定一个负值,imrotate函数按顺时针方向旋转图像。作为可选变量,还可以给imrotate函数指定产值方法和图像的大小;使用 imtransform 函数完成一般的二维空间转换。其语法格式如下:B=imtransform(A,TFORM,paraml,vall,param2,val2)。该函数接受两个主要变量,既要变换的图像和TFORM空间变换结构。 创建一个TFORM结构有两种方法,即使用makeform 函数和cp2tform 函数。使用makeform函数,可指定变换类型。在本次实验中,指定的是仿射变换“affine”类型,即进行平移,旋转,比例,拉伸和错切等功能。仿射变换要求变换矩阵的最后一列除最后一个元素为1之外,其它的均为0。对应源程序;lena4.m和lena5.m (2)MATLAB函数:图像二维仿射变换MATLAB使用imtransform函数完成图像空间变换。

调用格式:imtransform(A,T)

其中参数A是要变换的图像,T是由makeform函数产生的变换结构. 在maketform('P',......)函数中,参数P可以以一下形式: affine:仿射变换形式; projective:投影变换形式; cusyom:自定义函数变换;

box:利用函数中的另外参数产生仿射变换结构; composite:该参数是实现多次调用tformfwd功能;

maketform函数就是利用给定的参数建立变换结构,然后把该变换结构赋予结构变量T。 根据得到的结构体变量T,调用imtransform(A,T)函数进行变换。

(3)处理结果: Lena水平偏移:

Elaine水平偏移:

Lena旋转30度:

Elaine旋转30度:

(4)结果分析:

在数字图像处理中几何变换由两个基本操作组成:(1)坐标的空间变化;(2)灰度内插,即对空间变换后的像素赋灰度值。最常用的空间坐标变换之一是仿射变换。最近邻内插产生了最大的锯齿边缘,双线性内插得到了明显的改进结果,使用双三次内插产生了稍微清晰一些的结果。

旋转是保持直线特性方面最苛求的几何变换之一,与上一实验结果相同,最近邻内插产生了最大的锯齿边缘,双线性内插得到了明显的改进结果,使用双三次内插产生了稍微清晰一些的结果。

附录

【参考文献】

[1] 冈萨雷斯.数字图像处理(第三版)北京:电子工业出版社,2011 [2] 周品.MATLAB数字图像处理 北京:清华大学出版社,2012

[3] 杨杰.数字图像处理及MATLAB实现 北京:电子工业出版社,2010 【源代码】 lena.m

close all;clear all;clc; I=imread('lena512.bmp'); figure(1) imshow(I) title('8灰度级');

[x,y]=size(I);%读取lena.bmp的长宽 img7=zeros(x,y); img6=zeros(x,y); img5=zeros(x,y); img4=zeros(x,y); img3=zeros(x,y); img2=zeros(x,y); img1=zeros(x,y); for i=1:x for j=1:y

img7(i,j)=floor(I(i,j)/2); %floor为向下取整 end end figure(2)

imshow(uint8(img7),[0,127]) %unit8为8位二进制数 title('7灰度级');

for i=1:x for j=1:y

img6(i,j)=floor(I(i,j)/4); end end figure(3)

imshow(uint8(img6),[0,63]) title('6灰度级');

for i=1:x for j=1:y

img5(i,j)=floor(I(i,j)/8); end end