matlab图像双线性插值-最近邻插值与几何变换
- 格式:doc
- 大小:1.31 MB
- 文档页数:6
MATLAB技术图像插值方法引言在现代数字图像处理领域中,图像插值是一项重要的技术。
插值方法用于增加由离散数值组成的图像的分辨率和细节,以提高图像的质量。
MATLAB作为一种强大的数值计算和图像处理工具,提供了多种图像插值方法,本文将介绍其中几种常用的方法以及其应用。
1. 双线性插值法双线性插值法是一种简单而常用的插值方法。
该方法通过在目标像素周围的四个相邻像素之间进行线性插值来估计目标像素的灰度值。
具体而言,假设目标像素位于离散坐标(x,y)处,其周围四个像素为P1(x1,y1),P2(x2,y2),P3(x1,y2),P4(x2,y1),则目标像素的灰度值可以通过以下公式计算得到:I(x,y) = (1-dx)(1-dy)I(P1) + dx(1-dy)I(P2) + (1-dx)dyI(P3) + dxdyI(P4)其中,dx = x-x1,dy = y-y1。
双线性插值法的优点在于简单,计算效率高,但其结果对于曲线边缘可能会产生模糊的效果。
2. 双三次插值法双三次插值法是一种更高级的插值方法,它通过在目标像素周围的16个相邻像素之间进行三次样条插值来估计目标像素的灰度值。
具体而言,假设目标像素位于离散坐标(x,y)处,其周围16个像素为Pn,其中n=1,2,...,16,那么目标像素的灰度值可以通过以下公式计算得到:I(x,y) = ∑wi(x,y)I(Pi)其中,wi(x,y)是插值权重,Pi是第i个相邻像素的灰度值。
双三次插值法的优点在于能够更好地保持图像的细节和边缘信息,并且结果较为平滑。
但由于计算量较大,相对于双线性插值法,它的速度较慢。
3. 基于卷积核的插值法除了双线性插值法和双三次插值法之外,MATLAB还提供了基于卷积核的插值方法,如图像放大中的“拉普拉斯金字塔”算法。
这种方法采用了金字塔结构,将原始图像不断降采样生成多层金字塔,然后根据不同的插值需求选择相应层级的低分辨率图像,并根据图像金字塔层级进行插值处理。
图像插值技术——双线性插值法在图像处理中,如果需要对图像进⾏缩放,⼀般可以采取插值法,最常⽤的就是双线性插值法。
本⽂⾸先从数学⾓度推导了⼀维线性插值和⼆维线性插值的计算过程,并总结了规律。
随后将其应⽤到图像的双线性插值上,利⽤Matlab编程进⾏图像的缩放验证,实验证明,⼆维线性插值能够对图像做出较好的缩放效果。
数学⾓度的线性插值⼀维线性插值假设有⼀个⼀元函数 y=f(x) , 已知曲线上的两点,A 和 B 的坐标分别为 (x0,y0) 、(x1,y1) 。
现在要在A 和 B 之间通过插值计算出⼀个点 P ,若已知 P点的横坐标 x,如何求出 P点的纵坐标 y ?这⾥我们的插值之所以叫做线性插值,就是因为我们假定了 P 点落在 A 点和 B 点的连线上,使得他们的坐标之间满⾜线性关系。
所以,根据初中的知识,可以得到下⾯的等式:y−y0 y1−y0=x−x0 x1−x0这⾥我们令:α=x−x0 x1−x0于是,我们可以得到P点的纵坐标 y 的表达式:y=(1−α)f(x0)+αf(x1)⼆维线性插值⼀维线性插值可以扩展到⼆维的情况。
假设有⼀个⼆元函数 z=f(x,y) , 已知曲⾯上的四点,A 、B 、C、D的坐标分别为 (x0,y0) 、(x1,y0) 、(x1,y1)、(x0,y1) 。
现在要在A 、B 、C、D之间通过插值计算出⼀个点 P ,若已知 P点的坐标 (x,y),如何求出 P点的函数值坐标 z ?这⾥我们依旧可以仿照⼀维线性插值,进⾏计算。
假设先计算 y 轴⽅向的插值点 P0 和 P1 ,则根据上⾯的推导过程,且令α=y−y0 y1−y0则, P0 的取值 z0为:z0=(1−α)f(x0,y0)+αf(x0,y1) P1 的取值 z1为:z1=(1−α)f(x1,y0)+αf(x1,y1)再计算 x 轴⽅向的插值点 P,令β=x−x0 x1−x0则 P 的取值 z为:z=(1−β)z0+βz1整理得到下⾯的式⼦:z =(1−β)(1−α)f x 0,y 0+αf x 0,y 1+β(1−α)f x 1,y 0+αf x 1,y 1=(1−β)(1−α)f x 0,y 0+(1−β)αf x 0,y 1+β(1−α)f x 1,y 0+βαf x 1,y 1⼩结由⼀维线性插值过渡到⼆维线性插值,我们发现,⼆者在表达式上有相似的规律:⼀维线性插值:y =f (x )α=x p −x 0x 1−x 0y p =(1−α)f x 0+αf x 1⼆维线性插值:z =f (x ,y )α=x p −x 0x 1−x 0,β=y p −y 0y 1−y 0z p =(1−β)(1−α)f x 0,y 0+(1−β)αf x 0,y 1+β(1−α)f x 1,y 0+βαf x 1,y 1图像中的双线性插值我们可以⽤函数来表⽰⼀幅图像(假设为单通道)。
实验二图像几何变换与插值一、实验目的巩固图像处理编程的步骤格式,理解数据插值及图像几何变换的原理,掌握图像几何变换的实现方法。
二、实验内容1、理解反向变换的实现思路2、图像缩放及插值Matlab取整命令:floor, ceil, round分别实验最近邻插值和双线性插值f=imread('lena.bmp');beishu=0.5;[row,col]=size(f);r1=round(row*beishu);c1=round(col*beishu);b=zeros(r1,c1);for i=1:r1for j=1:c1i1=round(i/beishu);j1=round(j/beishu);if i1<1i1=1;endif j1<1j1=1;endb(i,j)=f(i1,j1);endendb=uint8(b);figure;imshow(f);figureimshow(b);3、图像旋转及插值以图像中心为轴实现任意角度(逆时针为正)的图像旋转,分别实验两种插值算法f=imread('lena.bmp');B=imrotate(f,45,'nearest','crop');C=imrotate(f,45,'bilinear','crop');figure;subplot(121);imshow(f);title('原图像');subplot(122);imshow(B);title('最近邻插值');figure;subplot(121);imshow(f);title('原图像');subplot(122);imshow(C);title('双线性插值');原图像最近邻插值处理原图像双线性插值处理%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% matlab练习程序(图像放大/缩小,最邻近插值)ccccl;w=0.6; %放大或缩小的宽度h=1.4; %放大或缩小的高度img=imread('Corner.png');imshow(img);[m n]=size(img);imgn=zeros(h*m,w*n);rot=[h 0 0;0 w 0;0 0 1]; %变换矩阵x=h*u,y=w*vinv_rot=inv(rot);for x=1:h*mfor y=1:w*npix=[x y 1]*inv_rot;imgn(x,y)=img(round(pix(1)),round(pix(2)));endendfigure,imshow(uint8(imgn)) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% matlab练习程序(图像放大/缩小,双线性插值)cccm=1.8; %放大或缩小的高度n=2.3; %放大或缩小的宽度img=imread('lena.jpg');imshow(img);[h w]=size(img);imgn=zeros(h*m,w*n);rot=[m 0 0;0 n 0;0 0 1]; %变换矩阵for i=1:h*mfor j=1:w*npix=[i j 1]/rot;float_Y=pix(1)-floor(pix(1));float_X=pix(2)-floor(pix(2));if pix(1) < 1%边界处理pix(1) = 1;endif pix(1) > hpix(1) = h;endif pix(2) < 1pix(2) =1;endif pix(2) > wpix(2) =w;endpix_up_left=[floor(pix(1)) floor(pix(2))];%四个相邻的点pix_up_right=[floor(pix(1)) ceil(pix(2))];pix_down_left=[ceil(pix(1)) floor(pix(2))];pix_down_right=[ceil(pix(1)) ceil(pix(2))];value_up_left=(1-float_X)*(1-float_Y);%计算临近四个点的权重value_up_right=float_X*(1-float_Y);value_down_left=(1-float_X)*float_Y;value_down_right=float_X*float_Y;%按权重进行双线性插值imgn(i,j)=value_up_left*img(pix_up_left(1),pix_up_left(2))+ ...value_up_right*img(pix_up_right(1),pix_up_right(2))+ ...value_down_left*img(pix_down_left(1),pix_down_left(2))+ ...value_down_right*img(pix_down_right(1),pix_down_right(2));endendfigure,imshow(uint8(imgn)) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% matlab练习程序(图像旋转,最邻近插值)ccccl;H=1; %索引pix中第一个元素,即高度W=2; %索引pix中第二个元素,即宽度jiaodu=45; %要旋转的角度,旋转方向为顺时针img=imread('Corner.png'); %这里v为原图像的高度,u为原图像的宽度imshow(img); %这里y为变换后图像的高度,x为变换后图像的宽度[v u]=size(img);theta=jiaodu/180*pi;rot=[cos(theta) -sin(theta) 0;sin(theta) cos(theta) 0;0 0 1];inv_rot=inv(rot);pix1=[1 1 1]*rot; %变换后图像左上点的坐标pix2=[1 u 1]*rot; %变换后图像右上点的坐标pix3=[v 1 1]*rot; %变换后图像左下点的坐标pix4=[v u 1]*rot; %变换后图像右下点的坐标height=round(max([abs(pix1(H)-pix4(H))+0.5 abs(pix2(H)-pix3(H))+0.5])); %变换后图像的高度width=round(max([abs(pix1(W)-pix4(W))+0.5 abs(pix2(W)-pix3(W))+0.5])); %变换后图像的宽度imgn=zeros(height,width);delta_y=abs(min([pix1(H) pix2(H) pix3(H) pix4(H)])); %取得y方向的负轴超出的偏移量delta_x=abs(min([pix1(W) pix2(W) pix3(W) pix4(W)])); %取得x方向的负轴超出的偏移量for y=1-delta_y:height-delta_yfor x=1-delta_x:width-delta_xpix=[y x 1]*inv_rot; %用变换后图像的点的坐标去寻找原图像点的坐标,%否则有些变换后的图像的像素点无法完全填充if pix(H)>=0.5 && pix(W)>=0.5 && pix(H)<=v && pix(W)<=uimgn(y+delta_y,x+delta_x)=img(round(pix(H)),round(pix(W)));endendendfigure,imshow(uint8(imgn))%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% matlab练习程序(图像旋转,双线性插值)cccjiaodu=45; %要旋转的角度,旋转方向为顺时针img=imread('lena.jpg'); %这里v为原图像的高度,u为原图像的宽度imshow(img); %这里y为变换后图像的高度,x为变换后图像的宽度[h w]=size(img);theta=jiaodu/180*pi;rot=[cos(theta) -sin(theta) 0;sin(theta) cos(theta) 0;0 0 1];pix1=[1 1 1]*rot; %变换后图像左上点的坐标pix2=[1 w 1]*rot; %变换后图像右上点的坐标pix3=[h 1 1]*rot; %变换后图像左下点的坐标pix4=[h w 1]*rot; %变换后图像右下点的坐标height=round(max([abs(pix1(1)-pix4(1))+0.5 abs(pix2(1)-pix3(1))+0.5])); %变换后图像的高度width=round(max([abs(pix1(2)-pix4(2))+0.5 abs(pix2(2)-pix3(2))+0.5])); %变换后图像的宽度imgn=zeros(height,width);delta_y=abs(min([pix1(1) pix2(1) pix3(1) pix4(1)])); %取得y方向的负轴超出的偏移量delta_x=abs(min([pix1(2) pix2(2) pix3(2) pix4(2)])); %取得x方向的负轴超出的偏移量for i=1-delta_y:height-delta_yfor j=1-delta_x:width-delta_xpix=[i j 1]/rot; %用变换后图像的点的坐标去寻找原图像点的坐标,%否则有些变换后的图像的像素点无法完全填充float_Y=pix(1)-floor(pix(1));float_X=pix(2)-floor(pix(2));if pix(1)>=1 && pix(2)>=1 && pix(1) <= h && pix(2) <= wpix_up_left=[floor(pix(1)) floor(pix(2))]; %四个相邻的点pix_up_right=[floor(pix(1)) ceil(pix(2))];pix_down_left=[ceil(pix(1)) floor(pix(2))];pix_down_right=[ceil(pix(1)) ceil(pix(2))];value_up_left=(1-float_X)*(1-float_Y); %计算临近四个点的权重value_up_right=float_X*(1-float_Y);value_down_left=(1-float_X)*float_Y;value_down_right=float_X*float_Y;imgn(i+delta_y,j+delta_x)=value_up_left*img(pix_up_left(1),pix_up_left(2))+ ...value_up_right*img(pix_up_right(1),pix_up_right(2))+ ...value_down_left*img(pix_down_left(1),pix_down_left(2))+ ...value_down_right*img(pix_down_right(1),pix_down_right(2));endendendfigure,imshow(uint8(imgn)) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%实验一 Matlab图像基本操作一、实验目的熟悉利用Matlab进行图像处理的基本操作,了解图像数据的存储形式及进行图像处理编程的步骤方法。
如何进行MATLAB图像配准和变换引言图像配准和变换是数字图像处理中一项重要任务,它能够将不同空间、不同感知角度或不同时间采集的图像进行对齐,从而实现图像像素之间的准确匹配。
MATLAB作为一种常用的科学计算软件,提供了丰富的图像处理函数和工具箱。
本文将介绍如何使用MATLAB进行图像配准和变换,以帮助读者更好地理解和应用这些功能。
一、图像配准基础1. 图像配准定义图像配准是指将两幅或多幅图像通过某种变化,使得它们的像素点对齐。
这种对齐可以通过平移、旋转、缩放等几何变换来实现。
2. 图像配准应用图像配准在许多领域都有广泛的应用,如医学图像处理、遥感图像处理、计算机视觉等。
例如,在医学领域,图像配准可以用于将不同时间拍摄的磁共振图像对齐,以便医生更好地观察患者的病情变化。
二、MATLAB图像配准函数MATLAB提供了几个常用的图像配准函数和工具箱,方便用户进行图像配准和变换。
下面将介绍一些常用的函数和工具箱。
1. imregister函数imregister函数是MATLAB中一个常用的图像配准函数,它能够将两幅图像进行几何变换以实现图像配准。
该函数基于最大互信息和归一化互相关等算法实现,能够自动处理旋转、平移、缩放和扭曲等运动畸变。
2. cpselect工具箱cpselect工具箱是MATLAB中用于图像配准的一个交互式工具箱。
它能够通过用户交互的方式,选择两幅图像中的对应点,计算并输出变换矩阵。
用户可以通过可视化的界面进行点选,并查看配准效果。
三、图像配准步骤基于MATLAB提供的函数和工具箱,进行图像配准的一般步骤如下:1. 加载图像使用imread函数加载待配准的图像,将其转换为灰度图像或彩色图像,存储为变量img1和img2。
2. 预处理图像根据具体情况,对图像进行预处理操作,如去噪、平滑、增强等。
这一步骤可以提高后续配准的准确性和稳定性。
3. 选择对应点使用cpselect工具箱,通过交互方式选择两幅图像中的对应点。
实验九、图像几何变换一,目的1)了解图像变换的基本原理2)掌握最近邻法及双线插值法二,实验条件1)微型计算机:INTEL 奔腾及更高2)MATLAB3)典型的灰度、彩色图像文件三,原理1)最近邻点法2)双线性插值法四,实验内容1)对给定的图像进行缩放,倍率分别为1.5和0.7,在缩放过程中,根据灰度值不变原理相应位置的灰度值进行记标,其中不能直接在对应的位置予以插值,记标分别按最近邻法和双线法确定之;i.最近邻法clearcd d:I_=imread('test.jpg');%读入原始图像I1=rgb2gray(I_);%I2=double(I1);% J1_5 = imresize(I1,1.5);%调整图像的大小% J0_7 = imresize(I1,.7);%调整图像的大小[i,j]=size(I1);m=round(i*1.5);n=round(j*1.5);m_=round(i*0.7);n_=round(j*0.7);% 1.5倍最邻近TEMP=zeros(m,n);%产生m*n矩阵for i = 1:mfor j = 1:nTEMP(i,j)=I1(round(i/1.5),round(j/1.5));endendsubplot(1,3,1) ,imshow(I1),title('原图')TEMP1_5=uint8(TEMP);subplot(1,3,2),imshow(TEMP1_5),title('1.5倍最邻近')% 0.7倍最邻近TEMP7=zeros(m_,n_);%产生m*n矩阵for i_ = 1:m_for j_ = 1:n_TEMP7(i_,j_)=I1( round(i_/0.7),round(j_/0.7) );endendTEMP7_=uint8(TEMP7);subplot(1,3,3),imshow(TEMP7_),title('0.7倍最邻近')原始图像原始图像1.5倍最邻近0.7倍最邻近ii.双线法图像之间坐标映射有两种方式:如果是从原图像的坐标映射到目标图像,称为前向映射,反之则称为后向映射。
使⽤双线性插值法放⼤图像(matlab实现)双线性插值的概念及公式可以参考百度,这⾥仅对算法原理进⾏简单的说明:双线性插值计算公式:f(i+u,j+v) = (1-u)(1-v)f(i,j)+u(1-v)f(i+1,j)+(1-u)vf(i,j+1)+ uvf(i+1,j+1)这个公式表明了如何利⽤矩阵中的四个像素值计算新的像素值,这些新的像素值就组成了放⼤后的图像。
下图是如何将3x3的图像放⼤为4x4的图像:原图像表⽰为3x3的矩阵(像素值处在⿊线的交叉点上),如何计算4x4矩阵的值呢?(像素值处在红⾊虚线交叉点及红线与⿊线的交点上)⽐如新图像B的第⼀列与原图像A的第⼀列的对应关系是:B(1,1) = A(1,1)B(1,2) = A(1,1.66667)B(1,3) = A(1,2.33334)B(1,4) = A(1,3.00001)应⽤上⾯的公式,实际上就是⽤A的含有⼩数点的位置的像素值来计算B的像素值,但含有⼩数点位的像素是不存在的,这⾥称为虚拟位置。
⽤原图像A的值就能计算出放⼤后B的值,是不是很神奇?实际上可以这样认为:双线性插值就是把放⼤后的图像再压缩到原来图像的尺⼨⼤⼩,计算原图像中虚拟的像素值,等同于计算放⼤后图像的像素值,对于本例来说,B图像的步长相当于A图像步长的(3-1)/(4-1)=0.66667倍。
下⾯我们就可以利⽤这个⽐率来对应B中像素位置与A中虚拟像素位置的关系。
B(1,1) = A(1,1) (1-1)*0.66667+1=1B(1,2) = A(1,1.66667) (2-1)*0.66667+1=1.66667B(1,3) = A(1,2.33334) (3-1)*0.66667+1=2.33334B(1,4) = A(1,3.00001) (4-1)*0.66667+1=3.00001根据上⾯的对应关系,我们就可以⽤代码实现了。
现在还有⼀个问题:我们计算虚拟像素值是需要周围四个原像素值,⽐如上列中的(下图中红圈圈住的部分)A(1,3) = (1-0)(1-0)A(1,3) + (1-0)0A(1,4) + 0(1-0)A(2,3) + 00A(2,4)显然这⾥的A(1,4)和A(2,4)是⽆法索引到得,因为原图像是3x3的矩阵。
实验二图像几何变换与插值一、实验目的巩固图像处理编程的步骤格式,理解数据插值及图像几何变换的原理,掌握图像几何变换的实现方法。
二、实验内容1、理解反向变换的实现思路2、图像缩放及插值Matlab取整命令:floor, ceil, round分别实验最近邻插值和双线性插值f=imread('lena.bmp');beishu=0.5;[row,col]=size(f);r1=round(row*beishu);c1=round(col*beishu);b=zeros(r1,c1);for i=1:r1for j=1:c1i1=round(i/beishu);j1=round(j/beishu);if i1<1i1=1;endif j1<1j1=1;endb(i,j)=f(i1,j1);endendb=uint8(b);figure;imshow(f);figureimshow(b);3、图像旋转及插值以图像中心为轴实现任意角度(逆时针为正)的图像旋转,分别实验两种插值算法f=imread('lena.bmp');B=imrotate(f,45,'nearest','crop');C=imrotate(f,45,'bilinear','crop');figure;subplot(121);imshow(f);title('原图像');subplot(122);imshow(B);title('最近邻插值');figure;subplot(121);imshow(f);title('原图像');subplot(122);imshow(C);title('双线性插值');原图像最近邻插值处理原图像双线性插值处理%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% matlab练习程序(图像放大/缩小,最邻近插值)ccccl;w=0.6; %放大或缩小的宽度h=1.4; %放大或缩小的高度img=imread('Corner.png');imshow(img);[m n]=size(img);imgn=zeros(h*m,w*n);rot=[h 0 0;0 w 0;0 0 1]; %变换矩阵x=h*u,y=w*vinv_rot=inv(rot);for x=1:h*mfor y=1:w*npix=[x y 1]*inv_rot;imgn(x,y)=img(round(pix(1)),round(pix(2)));endendfigure,imshow(uint8(imgn)) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% matlab练习程序(图像放大/缩小,双线性插值)cccm=1.8; %放大或缩小的高度n=2.3; %放大或缩小的宽度img=imread('lena.jpg');imshow(img);[h w]=size(img);imgn=zeros(h*m,w*n);rot=[m 0 0;0 n 0;0 0 1]; %变换矩阵for i=1:h*mfor j=1:w*npix=[i j 1]/rot;float_Y=pix(1)-floor(pix(1));float_X=pix(2)-floor(pix(2));if pix(1) < 1%边界处理pix(1) = 1;endif pix(1) > hpix(1) = h;endif pix(2) < 1pix(2) =1;endif pix(2) > wpix(2) =w;endpix_up_left=[floor(pix(1)) floor(pix(2))];%四个相邻的点pix_up_right=[floor(pix(1)) ceil(pix(2))];pix_down_left=[ceil(pix(1)) floor(pix(2))];pix_down_right=[ceil(pix(1)) ceil(pix(2))];value_up_left=(1-float_X)*(1-float_Y);%计算临近四个点的权重value_up_right=float_X*(1-float_Y);value_down_left=(1-float_X)*float_Y;value_down_right=float_X*float_Y;%按权重进行双线性插值imgn(i,j)=value_up_left*img(pix_up_left(1),pix_up_left(2))+ ...value_up_right*img(pix_up_right(1),pix_up_right(2))+ ...value_down_left*img(pix_down_left(1),pix_down_left(2))+ ...value_down_right*img(pix_down_right(1),pix_down_right(2));endendfigure,imshow(uint8(imgn)) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% matlab练习程序(图像旋转,最邻近插值)ccccl;H=1; %索引pix中第一个元素,即高度W=2; %索引pix中第二个元素,即宽度jiaodu=45; %要旋转的角度,旋转方向为顺时针img=imread('Corner.png'); %这里v为原图像的高度,u为原图像的宽度imshow(img); %这里y为变换后图像的高度,x为变换后图像的宽度[v u]=size(img);theta=jiaodu/180*pi;rot=[cos(theta) -sin(theta) 0;sin(theta) cos(theta) 0;0 0 1];inv_rot=inv(rot);pix1=[1 1 1]*rot; %变换后图像左上点的坐标pix2=[1 u 1]*rot; %变换后图像右上点的坐标pix3=[v 1 1]*rot; %变换后图像左下点的坐标pix4=[v u 1]*rot; %变换后图像右下点的坐标height=round(max([abs(pix1(H)-pix4(H))+0.5 abs(pix2(H)-pix3(H))+0.5])); %变换后图像的高度width=round(max([abs(pix1(W)-pix4(W))+0.5 abs(pix2(W)-pix3(W))+0.5])); %变换后图像的宽度imgn=zeros(height,width);delta_y=abs(min([pix1(H) pix2(H) pix3(H) pix4(H)])); %取得y方向的负轴超出的偏移量delta_x=abs(min([pix1(W) pix2(W) pix3(W) pix4(W)])); %取得x方向的负轴超出的偏移量for y=1-delta_y:height-delta_yfor x=1-delta_x:width-delta_xpix=[y x 1]*inv_rot; %用变换后图像的点的坐标去寻找原图像点的坐标,%否则有些变换后的图像的像素点无法完全填充if pix(H)>=0.5 && pix(W)>=0.5 && pix(H)<=v && pix(W)<=uimgn(y+delta_y,x+delta_x)=img(round(pix(H)),round(pix(W)));endendendfigure,imshow(uint8(imgn))%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% matlab练习程序(图像旋转,双线性插值)cccjiaodu=45; %要旋转的角度,旋转方向为顺时针img=imread('lena.jpg'); %这里v为原图像的高度,u为原图像的宽度imshow(img); %这里y为变换后图像的高度,x为变换后图像的宽度[h w]=size(img);theta=jiaodu/180*pi;rot=[cos(theta) -sin(theta) 0;sin(theta) cos(theta) 0;0 0 1];pix1=[1 1 1]*rot; %变换后图像左上点的坐标pix2=[1 w 1]*rot; %变换后图像右上点的坐标pix3=[h 1 1]*rot; %变换后图像左下点的坐标pix4=[h w 1]*rot; %变换后图像右下点的坐标height=round(max([abs(pix1(1)-pix4(1))+0.5 abs(pix2(1)-pix3(1))+0.5])); %变换后图像的高度width=round(max([abs(pix1(2)-pix4(2))+0.5 abs(pix2(2)-pix3(2))+0.5])); %变换后图像的宽度imgn=zeros(height,width);delta_y=abs(min([pix1(1) pix2(1) pix3(1) pix4(1)])); %取得y方向的负轴超出的偏移量delta_x=abs(min([pix1(2) pix2(2) pix3(2) pix4(2)])); %取得x方向的负轴超出的偏移量for i=1-delta_y:height-delta_yfor j=1-delta_x:width-delta_xpix=[i j 1]/rot; %用变换后图像的点的坐标去寻找原图像点的坐标,%否则有些变换后的图像的像素点无法完全填充float_Y=pix(1)-floor(pix(1));float_X=pix(2)-floor(pix(2));if pix(1)>=1 && pix(2)>=1 && pix(1) <= h && pix(2) <= wpix_up_left=[floor(pix(1)) floor(pix(2))]; %四个相邻的点pix_up_right=[floor(pix(1)) ceil(pix(2))];pix_down_left=[ceil(pix(1)) floor(pix(2))];pix_down_right=[ceil(pix(1)) ceil(pix(2))];value_up_left=(1-float_X)*(1-float_Y); %计算临近四个点的权重value_up_right=float_X*(1-float_Y);value_down_left=(1-float_X)*float_Y;value_down_right=float_X*float_Y;imgn(i+delta_y,j+delta_x)=value_up_left*img(pix_up_left(1),pix_up_left(2))+ ...value_up_right*img(pix_up_right(1),pix_up_right(2))+ ...value_down_left*img(pix_down_left(1),pix_down_left(2))+ ...value_down_right*img(pix_down_right(1),pix_down_right(2));endendendfigure,imshow(uint8(imgn)) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%实验一 Matlab图像基本操作一、实验目的熟悉利用Matlab进行图像处理的基本操作,了解图像数据的存储形式及进行图像处理编程的步骤方法。