matlab旋转实现(最近邻值-双线性-三次卷积插值实现插值)
Matlab插值
![Matlab插值](https://img.taocdn.com/s3/m/b097425ca76e58fafab003b4.png)
(2)由图形可见,若可由 散点图得到时间和温度 的函数关系(一元函 数),则问题得解!
35
30
散
25
点
20
图
15
10
5
0
2
4
6
8 10 12
显然,找时间和温度间的函数关系是很难的!
那我们是否可以找到一条经过每一个点的简单函数 作为它的近似呢?
3
插值
在离散数据的基础上补插连续函数,使得 这条连续曲线通过全部给定的离散数据点。插 值是离散函数逼近的重要方法,利用它可通过 函数在有限个点处的取值状况,估算出函数在 其他点处的近似值。
返回 17
三次样条插值 是一种分段插值,比分段线性插值更光滑!
y
a
xi-1 xi
bx
在数学上,光滑程度的定量描述是:函数(曲线) 的k阶可导且连续,则称该曲线具有k阶光滑性。
光滑性的阶次越高,则越光滑。为了得到具有
较高阶光滑性的分段低次插值多项式,我们介绍三 次样条插值。
18
1、了解插值的基本内容。 2、掌握用Matlab软件包求解插值问题。
[1] 问题的提出 [2] 一维插值 [3] 二维插值
2
问题1
在1-12的11小时内,每隔1小时测量一次温度,测得的温度 依次为:5,8,9,15,25,29,31,30,22,25,27,24 试估计每隔1/10小时的温度值。
分析:
y0
x x1
x0 x0
x x2 x1 x2
y1
x x2
x0 x0
MATLAB技术图像插值方法
![MATLAB技术图像插值方法](https://img.taocdn.com/s3/m/857feee832d4b14e852458fb770bf78a64293a60.png)
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作函数插值
![用MATLAB作函数插值](https://img.taocdn.com/s3/m/fef54cf0941ea76e58fa0411.png)
1.先在三维坐标画出原始数据,画出粗糙的温度分布曲面图. 输入以下命令: x=1:5; y=1:3; temps=[82 81 80 82 84;79 63 61 65 81;84 84 82 85 86]; mesh(x,y,temps) 2.以平滑数据,在x、y方向上每隔0.2个单位的地方进行插值.
figure(5) subplot(1,3,1),contour(xi,yi,z1i,10,'r'); subplot(1,3,2),contour(xi,yi,z2i,10,'r'); subplot(1,3,3),contour(xi,yi,z3i,10,'r');
用MATLAB作散点数据的插值计算
例
已知飞机下轮廓线上数据如下,求x每改变0.1时的y值。
X Y
0 3 5 7 9 1 1 1 1 1 1 2 3 4 5 0 12 17 20 21 20 18 12 10 16 . . . . . . . . .
机翼下 轮廓线 y
x
x0=[0 3 5 7 9 11 12 13 14 15 ]; y0=[0 1.2 1.7 2.0 2.1 2.0 1.8 1.2 1.0 1.6 ]; x=0:0.1:15; y1=lagr1(x0,y0,x); y2=interp1(x0,y0,x); y3=interp1(x0,y0,x,'spline'); subplot(3,1,1) plot(x0,y0,'k+',x,y1,'r') grid title('lagrange') subplot(3,1,2) plot(x0,y0,'k+',x,y2,'r') grid title('piecewise linear') subplot(3,1,3) plot(x0,y0,'k+',x,y3,'r') grid title('spline')
matlab图像双线性插值-最近邻插值与几何变换
![matlab图像双线性插值-最近邻插值与几何变换](https://img.taocdn.com/s3/m/50df1c34f121dd36a22d8282.png)
实验二图像几何变换与插值一、实验目的巩固图像处理编程的步骤格式,理解数据插值及图像几何变换的原理,掌握图像几何变换的实现方法。
二、实验内容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旋转+双线性插值](https://img.taocdn.com/s3/m/a27e62354b35eefdc8d333c5.png)
自己写的Matlab 旋转+双线性插值图像函数效果图:源码:clear all;I = imread('original.jpg');[Height,Width,RGB] = size(I);II = I;%当角度为0时直接输出%本程序是以左上角为坐标原点%angle_j是旋转角度,正值是按顺时针旋转,负值时按逆时针旋转angle_j = 181;%angle是弧度angle = 2*pi*angle_j/360;%将angle转成正值while(angle < 0)angle = 2 * pi + angle;end%约束在0-2π内while(angle > 2 * pi)angle = angle - 2 * pi;end%tag是判断下面的while循环有没有执行过tag = 0;while(angle > 0)%超过90度的旋转,都先旋转90度,直到角度在0°-90°之间%原理是旋转90度整数倍时,信息是不丢失的if angle >= pi/2a = pi/2;angle = angle - pi/2;elseif 0 < angle < pi/2a = angle;angle = 0;endif tag == 0tag = 1;elseI = II;[Height,Width,RGB] = size(I);%在旋转后的图像上继续旋转,从而实现大于90°的旋转end%正向变换用sina = sin(a);cosa = cos(a);%逆向变换用_m == _minussina_m = sin(-a);cosa_m = cos(-a);%旋转后图像的长度和宽度II_height = round(sina * Width + cosa * Height);II_width = round(sina * Height + cosa * Width);II = ones(II_height,II_width,3);%先转成unit8。
matlab插值方法
![matlab插值方法](https://img.taocdn.com/s3/m/0282832383c4bb4cf7ecd138.png)
数据插值
1
实验目的
1、了解插值的基本内容。 2、掌握用数学软件包求解插值问题。
实验内容
[1]一维插值
[2]二维插值 [3]实验作业
2
一 一、插值的定义 二、插值的方法
维
插
值
拉格朗日插值
分段线性插值
三次样条插值 三、用Matlab解插值问题
返回
3
二维插值
一、二维插值定义 二、网格节点插值法
6
例 已知飞机机翼下轮廓线上数据如下,求x每改变0.1时的y 值。
X Y
0 0
3 1.2
5 1.7
7 2.0
9 2.1
y
11 2.0
12 1.8
13 1.2
14 1.0
15 1.6
机翼下 轮廓线
x
7
二维插值的定义
第一种(网格节点):
y
O
x
8
已知 mn个节点
其中 互不相同,不妨设
构造一个二元函数
通过全部已知节点,即
再用
计算插值,即
9
第二种(散乱节点):
y
0
x
10
已知n个节点
其中 互不相同,
构造一个二元函数
通过全部已知节点,即
再用
计算插值,即
返回
11
用MATLAB作网格节点数据的插值
z=interp2(x0,y0,z0,x,y,’method’)
被插值点 的函数值
插值 节点
被插值点
matlab三次样条插值的方法
![matlab三次样条插值的方法](https://img.taocdn.com/s3/m/53a60c6b0622192e453610661ed9ad51f01d54ac.png)
matlab三次样条插值的方法Cubic spline interpolation is a common method used in MATLAB to approximate values between specified data points. This technique involves fitting a piecewise cubic polynomial to the data points, ensuring that the function is smooth and continuous at the knots. Through this process, the spline curve can accurately represent the overall trend of the data, making it particularly useful in various scientific and engineering applications.三次样条插值是MATLAB中常用的一种方法,用于在指定数据点之间近似数值。
这种技术涉及将分段三次多项式拟合到数据点,确保在节点处函数平滑连续。
通过这个过程,样条曲线可以准确地表示数据的总体趋势,使其特别适用于各种科学和工程应用。
One advantage of cubic spline interpolation is its ability to capture the local behavior of the data while maintaining global smoothness. This is achieved by constructing individual cubic polynomials between adjacent data points, ensuring that the interpolated curve passes through each data point without introducing significant oscillations or deviations. As a result, cubic splines provide a reliableand visually appealing way to interpolate data that may exhibit complex patterns or fluctuations.三次样条插值的一个优点是能够捕捉数据的局部行为,同时保持全局的平滑性。
(整理)matlab插值计算.
![(整理)matlab插值计算.](https://img.taocdn.com/s3/m/37059a917c1cfad6185fa751.png)
插值方法晚上做一个曲线拟合,结果才开始用最小二乘法拟合时,拟合出来的东西太难看了!于是尝试用其他方法。
经过一番按图索骥,终于发现做曲线拟合的话,采用插值法是比较理想的方法。
尤其是样条插值,插完后线条十分光滑。
方法付后,最关键的问题是求解时要积分,放这里想要的时候就可以直接过来拿,不用死去搜索啦。
呵呵插值方法的Matlab实现一维数据插值MATLAB中用函数interp1来拟合一维数据,语法是YI = INTERP1(X,Y,XI,方法)其中(X,Y)是已给的数据点,XI 是插值点,其中方法主要有'linear' -线性插值,默认'pchip' -逐段三次Hermite插值'spline' -逐段三次样条函数插值其中最后一种插值的曲线比较平滑例:x=0:.12:1; x1=0:.02:1;%(其中x=0:.12:1表示显示的插值点,x1=0:.02:1表示插值的步长)y=(x.^2-3*x+5).*exp(-5*x).*sin(x);plot(x,y,'o'); hold on;y1=interp1(x,y,x1,'spline');plot(x1,y1,':')如果要根据样本点求函数的定积分,而函数又是比较光滑的,则可以用样条函数进行插值后再积分,在MATLAB中可以编写如下程序:function y=quadspln(x0,y0,a,b)f=inline('interp1(x0,y0,x,''spline'')','x','x0','y0');y=quadl(f,a,b,1e-8,[],x0,y0);现求sin(x)在区间[0,pi]上的定积分,只取5点x0=[0,0.4,1,2,pi];y0=sin(x0);I=quadspln(x0,y0,0,pi)结果得到的值为2.01905,精确值为2求一段matlab插值程序悬赏分:20 - 解决时间:2009-12-26 19:57已知5个数据点:x=[0.25 0.5 0.75 1] y=[0 0.3104 0.6177 0.7886 1] ,求一段matlab插值程序,求过这5个数据点的插值多项式,并在x-y坐标中画出y=f(x)图形,并且求出f (x)与x轴围成图形的面积(积分),不胜感激!使用Lagrange 插值多项式的方法:首先把下面的代码复制到M文件中,保存成lagranfunction [C,L]=lagran(X,Y)% input - X is a vector that contains a list of abscissas% - Y is a vector that contains a list of ordinates% output - C is a matrix that contains the coefficients of the lagrange interpolatory polynomial%- L is a matrix that contains the lagrange coefficients polynomialw=length(X);n=w-1;L=zeros(w,w);for k=1:n+1V=1;for j=1:n+1if k~=jV=conv(V,poly(X(j)))/(X(k)-X(j));endendL(k,:)=V;endC=Y*L;然后在命令窗口中输入以下内容:x=[0 0.25 0.5 0.75 1];y=[0 0.3104 0.6177 0.7886 1];lagran(x,y)ans =3.3088 -6.3851 3.3164 0.7599 0得到的数据就是多项式各项的系数,注意最后一个是常数项,即x^0,所以表达式为:f=3.3088*x.^4-6.3851*x.^3+3.3164*x.^2 +0.7599*x求面积就是积分求解>> f=@(x)3.3088*x.^4-6.3851*x.^3+3.3164*x.^2 +0.7599*x;>> quad(f,0,1)ans =0.5509这些点肯定是通过这个多项式的!MATLAB插值与拟合§1曲线拟合实例:温度曲线问题气象部门观测到一天某些时刻的温度变化数据为:试描绘出温度变化曲线。
双三次插值(bicubic interpolation)原理及MATLAB源码实现
![双三次插值(bicubic interpolation)原理及MATLAB源码实现](https://img.taocdn.com/s3/m/f2f9f8e9aeaad1f346933f34.png)
%双三次插值具体实现clc,clear;fff=imread('E:\Documents\BUPT\DIP\图片\lena.bmp');ff = rgb2gray(fff);%转化为灰度图像[mm,nn]=size(ff); %将图像隔行隔列抽取元素,得到缩小的图像fm=mm/2;n=nn/2;f = zeros(m,n);for i=1:mfor j=1:nf(i,j)=ff(2*i,2*j);endendk=5; %设置放大倍数bijiao1 = imresize(f,k,'bilinear');%双线性插值结果比较bijiao = uint8(bijiao1);a=f(1,:);c=f(m,:); %将待插值图像矩阵前后各扩展两行两列,共扩展四行四列b=[f(1,1),f(1,1),f(:,1)',f(m,1),f(m,1)];d=[f(1,n),f(1,n),f(:,n)',f(m,n),f(m,n)];a1=[a;a;f;c;c];b1=[b;b;a1';d;d];ffff=b1';f1=double(ffff);g1 = zeros(k*m,k*n);for i=1:k*m %利用双三次插值公式对新图象所有像素赋值u=rem(i,k)/k; i1=floor(i/k)+2;A=[sw(1+u) sw(u) sw(1-u) sw(2-u)];for j=1:k*nv=rem(j,k)/k;j1=floor(j/k)+2;C=[sw(1+v);sw(v);sw(1-v);sw(2-v)];B=[f1(i1-1,j1-1) f1(i1-1,j1) f1(i1-1,j1+1) f1(i1-1,j1+2)f1(i1,j1-1) f1(i1,j1) f1(i1,j1+1) f1(i1,j1+2)f1(i1+1,j1-1) f1(i1+1,j1) f1(i1+1,j1+1) f1(i1+1,j1+2)f1(i1+2,j1-1) f1(i1+2,j1) f1(i1+2,j1+1) f1(i1+2,j1+2)];g1(i,j)=(A*B*C);endendg=uint8(g1);imshow(uint8(f)); title('缩小的图像'); %显示缩小的图像figure,imshow(ff);title('原图'); %显示原图像figure,imshow(g);title('双三次插值放大的图像'); %显示插值后的图像figure,imshow(bijiao);title('双线性插值放大结果'); %显示插值后的图像mse=0;ff=double(ff);g=double(g);ff2=fftshift(fft2(ff)); %计算原图像和插值图像的傅立叶幅度谱g2=fftshift(fft2(g));figure,subplot(1,2,1),imshow(log(abs(ff2)),[8,10]);title('原图像的傅立叶幅度谱'); subplot(1,2,2),imshow(log(abs(g2)),[8,10]);title('双三次插值图像的傅立叶幅度谱');基函数代码:function A=sw(w1)w=abs(w1);if w<1&&w>=0A=1-2*w^2+w^3;elseif w>=1&&w<2A=4-8*w+5*w^2-w^3;elseA=0;end算法原理双三次插值又称立方卷积插值。
双三次插值原理及MATLAB源码实现
![双三次插值原理及MATLAB源码实现](https://img.taocdn.com/s3/m/d7d1ce1327d3240c8547ef1e.png)
%双三次插值具体实现;('E:\\\\图片\');= 2()转化为灰度图像[](); %将图像隔行隔列抽取元素,得到缩小的图像f22;f = ();11f()(2*i,2*j);5; %设置放大倍数1 = (,'')双线性插值结果比较= 8(1);(1,:)(m,:); %将待插值图像矩阵前后各扩展两行两列,共扩展四行四列[f(1,1)(1,1)(:,1)'(m,1)(m,1)][f(1)(1)()'()()];a1=[];b1=[1'];1'1();g1 = (k**n);1*m %利用双三次插值公式对新图象所有像素赋值(); i1()+2;[(1) (u) (1) (2)];1*n()1()+2;[(1)(v)(1)(2)];[f1(i1-11-1) f1(i1-11) f1(i1-11+1) f1(i1-11+2)f1(i11-1) f1(i11) f1(i11+1) f1(i11+2)f1(i1+11-1) f1(i1+11) f1(i1+11+1) f1(i1+11+2)f1(i1+21-1) f1(i1+21) f1(i1+21+1) f1(i1+21+2)];g1()=(A*B*C);8(g1);(8(f)); ('缩小的图像'); %显示缩小的图像()('原图'); %显示原图像(g)('双三次插值放大的图像'); %显示插值后的图像()('双线性插值放大结果'); %显示插值后的图像0()(g);2(2()); %计算原图像和插值图像的傅立叶幅度谱g2(2(g));(1,2,1)(((2)),[8,10])('原图像的傅立叶幅度谱');(1,2,2)(((g2)),[8,10])('双三次插值图像的傅立叶幅度谱');基函数代码:(w1)(w1);w<1>=01-2*w^2^3;w>=1<24-8*5*w^2^3;0;算法原理双三次插值又称立方卷积插值。
双三次插值原理及MATLAB源码实现
![双三次插值原理及MATLAB源码实现](https://img.taocdn.com/s3/m/d7d1ce1327d3240c8547ef1e.png)
%双三次插值具体实现;('E:\\\\图片\');= 2()转化为灰度图像[](); %将图像隔行隔列抽取元素,得到缩小的图像f22;f = ();11f()(2*i,2*j);5; %设置放大倍数1 = (,'')双线性插值结果比较= 8(1);(1,:)(m,:); %将待插值图像矩阵前后各扩展两行两列,共扩展四行四列[f(1,1)(1,1)(:,1)'(m,1)(m,1)][f(1)(1)()'()()];a1=[];b1=[1'];1'1();g1 = (k**n);1*m %利用双三次插值公式对新图象所有像素赋值(); i1()+2;[(1) (u) (1) (2)];1*n()1()+2;[(1)(v)(1)(2)];[f1(i1-11-1) f1(i1-11) f1(i1-11+1) f1(i1-11+2)f1(i11-1) f1(i11) f1(i11+1) f1(i11+2)f1(i1+11-1) f1(i1+11) f1(i1+11+1) f1(i1+11+2)f1(i1+21-1) f1(i1+21) f1(i1+21+1) f1(i1+21+2)];g1()=(A*B*C);8(g1);(8(f)); ('缩小的图像'); %显示缩小的图像()('原图'); %显示原图像(g)('双三次插值放大的图像'); %显示插值后的图像()('双线性插值放大结果'); %显示插值后的图像0()(g);2(2()); %计算原图像和插值图像的傅立叶幅度谱g2(2(g));(1,2,1)(((2)),[8,10])('原图像的傅立叶幅度谱');(1,2,2)(((g2)),[8,10])('双三次插值图像的傅立叶幅度谱');基函数代码:(w1)(w1);w<1>=01-2*w^2^3;w>=1<24-8*5*w^2^3;0;算法原理双三次插值又称立方卷积插值。
matlab双三次插值函数
![matlab双三次插值函数](https://img.taocdn.com/s3/m/9c73e96c59fb770bf78a6529647d27284b7337d4.png)
matlab双三次插值函数在MATLAB中,双三次插值函数可以通过使用`interp2`函数来实现。
`interp2`函数可以在二维网格上对数据进行插值,其中包括双三次插值。
下面我将详细介绍如何使用`interp2`函数进行双三次插值。
首先,`interp2`函数的基本语法如下:Vq = interp2(X, Y, V, Xq, Yq, 'spline');其中,`X`和`Y`是原始数据的网格坐标,`V`是原始数据的值,`Xq`和`Yq`是要进行插值的点的坐标,`Vq`是插值得到的值。
在这里,我们使用`spline`选项来指定双三次插值。
接下来,我将通过一个简单的示例来说明如何使用`interp2`函数进行双三次插值。
假设我们有一组原始数据`X`,`Y`和`V`,我们想要在新的坐标点`Xq`和`Yq`上进行双三次插值。
matlab.% 创建原始数据。
[X, Y] = meshgrid(1:5, 1:5);V = peaks(5); % 以peaks函数生成一个简单的二维数据作为示例。
% 创建新的坐标点。
[Xq, Yq] = meshgrid(1:0.1:5, 1:0.1:5); % 创建更密集的坐标点用于插值。
% 进行双三次插值。
Vq = interp2(X, Y, V, Xq, Yq, 'spline');% 可视化插值结果。
surf(Xq, Yq, Vq);在这个示例中,我们首先创建了原始数据`X`,`Y`和`V`,然后创建了新的坐标点`Xq`和`Yq`,并使用`interp2`函数进行双三次插值。
最后,我们通过绘制三维曲面来可视化插值结果。
需要注意的是,`interp2`函数还有其他选项可以用来指定不同的插值方法,比如线性插值、最近邻插值等。
另外,对于不规则的数据点,还可以使用`griddata`函数进行插值操作。
希望这个例子能够帮助你理解在MATLAB中如何使用双三次插值函数。
用matlab实现双线性插值旋转图像程序
![用matlab实现双线性插值旋转图像程序](https://img.taocdn.com/s3/m/5e1f48de240c844769eaee8d.png)
用matlab实现双线性插值旋转图像程序2008年11月06日星期四 19:13用matlab实现双线性插值旋转图像程序2008-04-27 12:51双线性插值:输出像素值是它在输入图像中2*2邻域采样点的平均值,它根据某像素周围4个像素的灰度值在水平和垂直两个方法上对其插值。
为了方便理解,先考虑一维情况下的线性插值:对于一个数列c,假设c[a]到c[a+1]之间是线性变化的,那么对于浮点数x(a<=x<a+1),c(x)=c[a+1]*(x-a)+c[a]*(1+a-x); 把这种插值方式扩展到二维情况:对于一个二维数组c,我们假设对于任意一个浮点数i,c(a,i)到c(a+1,i)之间是线性变化的,c(i,b)到c(i,b+1)之间也是线性变化的(a,b都是整数) ,那么对于浮点数的坐标(x,y)满足(a<=x<a+1,b<=y<b+1),可以先分别求出c(x,b)和c(x,b+1):c(x,b) = c[a+1][b]*(x-a)+c[a][b]*(1+a-x);c(x,b+1) = c[a+1][b+1]*(x-a)+c[a][b+1]*(1+a-x);好,现在已经知道c(x,b)和c(x,b+1)了,而根据假设c(x,b)到c(x,b+1)也是线性变化的,所以:c(x,y) = c(x,b+1)*(y-b)+c(x,b)*(1+b-y) 。
对应以上原理,双线性插值的matlab程序如下:function [imN] = im_R(im,rotation) %im是输入图像,rotation是旋转矩阵close all;im = imread(im);subplot(1,2,1);imshow(im);dim = ndims(im); %确定维数,对灰度和彩色图像分别处理w = size(im,2);h = size(im,1);if( dim == 3 )imN = zeros( h, w, 3 );elseimN = zeros(h,w);endim = double(im);for r = 1 : hfor c = 1 : wt = rotation * [ r - h / 2; c - w / 2 ] + [ h / 2; w / 2 ];%旋转if( t(1) > 1 && t(2) > 1 && t(1) < h && t(2) < w )%双线性插值 x = floor( t(1) );y = floor( t(2) );v1 = im( x + 1, y, : ) * ( t(1) - x ) + im( x, y, : ) * ( 1+ x - t(1) );v2 = im( x + 1, y + 1, : ) * ( t(1) - x ) + im( x, y + 1, : ) * ( 1 + x - t(1) );v = v2 * ( t(2) - y ) + v1 * ( 1 + y - t(2) );imN( r, c, : ) = round(v);endendendimN = uint8(imN);subplot(1,2,2);imshow(imN);出处:/kr1423/blog/item/89921324ce87862cd507424e.html三次样条插值法h0=figure('toolbar','none',...'position',[200 50 350 450],...'name','实例86');h1=axes('parent',h0,...'position',[0.10 0.45 0.8 0.5],...'visible','off');x=0:0.2:2*pi;y=sin(x);plot(x,y)b1=uicontrol('parent',h0,...'units','points',...'tag','b1',...'style','pushbutton',...'string','三次样条插值',...'backgroundcolor',[0.75 0.75 0.75],...'position',[20 60 70 20],...'callback',[...'y=0,',...'sy=0,',...'strn1=get(e2,''string'');,',...'n1=str2num(strn1);,',...'strn2=get(e3,''string'');,',...'n2=str2num(strn2);,',...'x=n1:0.2:n2;,',...'for t=n1:0.2:n2,',...'y(i)=sin(t);,',...'sy(i)=san(t,n1,n2);,',...'i=i+1;,',...'end,',...'plot(x,y,''b*'',x,sy,''r-''),',...'axis([0 7 -1.5 1.5]),',...'legend(''sin(x)'',''N-Hermite插值'')']);b2=uicontrol('parent',h0,...'units','points',...'tag','b2',...'style','pushbutton',...'string','误差比较',...'backgroundcolor',[0.75 0.75 0.75],...'position',[170 60 70 20],...'callback',[...'strdn1=get(e2,''string'');,',...'n1=str2num(strdn1);,',...'strdn2=get(e3,''string'');,',...'n2=str2num(strdn2);,',...'strdn=get(e1,''string'');,',...'dn=str2num(strdn);,',...'dd=abs(sin(dn)-san(dn,n1,n2));,',...'msgbox([''误差为:'',num2str(dd)],''计算结果'')']); e1=uicontrol('parent',h0,...'units','points',...'tag','e1',...'style','edit',...'fontsize',12,...'string','1.20',...'horizontalalignment','right',...'backgroundcolor',[1 1 1],...'position',[200 100 40 20]);t1=uicontrol('parent',h0,...'units','points',...'tag','t1',...'style','text',...'string','误差点:',...'fontsize',12,...'backgroundcolor',[0.75 0.75 0.75],...'position',[160 100 40 20]);e2=uicontrol('parent',h0,...'units','points',...'style','edit',...'fontsize',12,...'string','1.00',...'horizontalalignment','right',...'backgroundcolor',[1 1 1],...'position',[20 85 40 20]);t2=uicontrol('parent',h0,...'units','points',...'tag','t2',...'style','text',...'string','第一节点:',...'fontsize',12,...'backgroundcolor',[0.75 0.75 0.75],...'position',[15 105 50 20]);e3=uicontrol('parent',h0,...'units','points',...'tag','e3',...'style','edit',...'fontsize',12,...'string','3.00',...'horizontalalignment','right',...'backgroundcolor',[1 1 1],...'position',[100 85 40 20]);t3=uicontrol('parent',h0,...'units','points',...'tag','t3',...'style','text',...'string','第二节点:',...'fontsize',12,...'backgroundcolor',[0.75 0.75 0.75],...'position',[95 105 50 20]);b3=uicontrol('parent',h0,...'units','points',...'tag','b3',...'style','pushbutton',...'string','关闭',...'backgroundcolor',[0.75 0.75 0.75],...'position',[100 20 60 20],...。
双三次卷积重采样法matlab
![双三次卷积重采样法matlab](https://img.taocdn.com/s3/m/30d5f28309a1284ac850ad02de80d4d8d15a0117.png)
双三次卷积重采样法是指利用双三次插值方法对图像进行重采样的一种技术。
通过该方法,可以在图像缩放的过程中减少失真并保持图像质量。
1.引言图像处理是数字信号处理中的重要领域,它涵盖了图像的获取、存储、传输、处理和分析等方面。
在图像处理中,图像的重采样是指改变图像的采样率,从而改变图像的像素数量和大小,通常用于图像的缩放、旋转、翻转等操作。
双三次卷积重采样法是一种常用的图像重采样技术,它可以有效地保持图像细节,减少失真,提高图像质量。
2.双三次插值方法双三次插值方法是一种常用的插值方法,它通过对图像像素周围的像素进行加权求和,来估计目标像素的灰度值。
在双三次插值方法中,将目标像素周围的16个邻近像素进行插值计算,得到目标像素的灰度值。
使用双三次插值方法可以有效地减少图像重采样过程中的失真和伪影。
3.双三次卷积重采样法双三次卷积重采样法是基于双三次插值方法的一种图像重采样技术。
在该方法中,首先对目标图像进行重采样操作,然后利用双三次插值方法来估计目标像素的灰度值。
通过这种方式,可以有效地减少图像重采样过程中的失真和伪影,保持图像的细节和质量。
4.Matlab中的双三次卷积重采样Matlab是一种常用的科学计算软件,它提供了丰富的图像处理工具和函数。
在Matlab中,可以利用内置函数对图像进行双三次卷积重采样操作。
通过调用相关的函数,可以很容易地实现对图像的缩放和重采样,并且可以选择双三次插值方法来保持图像的细节和质量。
5.优缺点分析双三次卷积重采样法作为一种常用的图像重采样技术,具有以下优点:- 能够有效地保持图像的细节和质量,减少失真和伪影。
- 实现简单,易于理解和使用,在Matlab等软件中有现成的函数和工具可以调用。
- 适用于各种图像缩放和重采样操作,具有较好的通用性。
然而,双三次卷积重采样法也存在一些缺点:- 计算量较大,需要对目标像素周围的16个邻近像素进行插值计算,运算复杂度较高。
- 在某些情况下,可能会出现块状伪影等问题,影响图像的视觉效果。
三次样条插值matlab代码实现
![三次样条插值matlab代码实现](https://img.taocdn.com/s3/m/c601fc7b5b8102d276a20029bd64783e09127dfe.png)
三次样条插值matlab代码实现三次样条插值是一种常用的插值方法,可以用于曲线拟合和数据逼近。
在Matlab中,可以使用内置函数`interp1`来实现三次样条插值。
下面是一个简单的示例代码,演示了如何在Matlab中实现三次样条插值:matlab.% 创建一些示例数据。
x = 1:5;y = [3 6 5 8 2];% 生成更密集的x值,用于插值。
xi = 1:0.1:5;% 使用interp1进行三次样条插值。
yi = interp1(x, y, xi, 'spline');% 绘制原始数据和插值结果。
plot(x, y, 'o', xi, yi, '-');legend('原始数据', '三次样条插值');在这个示例中,我们首先创建了一些示例数据`x`和`y`,然后生成了更密集的`xi`值,用于插值。
接下来,我们使用`interp1`函数进行三次样条插值,并将结果存储在`yi`中。
最后,我们使用`plot`函数将原始数据和插值结果可视化出来。
需要注意的是,`interp1`函数中的第四个参数'spline'表示我们使用三次样条插值方法。
除了'spline'外,还可以选择'linear'(线性插值)或'pchip'(分段立方插值)等方法,具体选择取决于实际情况和数据特点。
以上就是在Matlab中实现三次样条插值的简单示例代码。
当然,实际应用中可能涉及到更复杂的数据和情况,需要根据具体问题进行相应的调整和处理。
希望这个示例能够帮助到你理解如何在Matlab中实现三次样条插值。
matlab矩阵旋转任意角度的函数imrotate
![matlab矩阵旋转任意角度的函数imrotate](https://img.taocdn.com/s3/m/e47a28210166f5335a8102d276a20029bd6463e0.png)
matlab矩阵旋转任意⾓度的函数imrotate >>帮助 imrotate旋转图像。
B=imrotate(A,ANGLE)在A中按⾓度旋转图像A围绕其中⼼点的逆时针⽅向。
旋转图像顺时针⽅向,为“⾓度”指定负值。
imrotate⽣成输出图像B⼤到⾜以包含整个旋转图像。
imrotate使⽤最近邻插值,设置B中像素的值在旋转后的图像外为0(零)。
B=imrotate(A,⾓度,⽅法)使⽤插值旋转图像A⽅法指定的⽅法。
⽅法是⼀个字符串,它可以具有以下值。
默认值⽤⼤括号({})括起来。
{'nearest'}最近邻插值“双线性”双线性插值“双三次”双三次插值。
注:此插值⽅法可以在原始值之外⽣成像素值范围。
B=imrotate(A,ANGLE,METHOD,BBOX)旋转图像A,其中BBOX指定输出图像B.BBOX的⼤⼩是⼀个⽂本字符串,可以以下值之⼀。
默认值⽤⼤括号括起来({}).{'loose'}使输出图像B⾜够⼤以包含整个旋转图像。
B⼀般⽐A⼤。
“裁剪”使输出图像B的⼤⼩与输⼊图像相同A、裁剪旋转图像以适应。
Class⽀持-------------输⼊图像可以是数字图像或逻辑图像。
输出图像是与输⼊图像相同的类。
注意----函数imrotate在版本9.3(R2015b)中发⽣了更改。
上⼀个图像处理⼯具箱的版本使⽤不同的空间习俗。
如果你需要同样的结果实现时,使⽤函数IMROTATE\u OLD。
此函数可以利⽤数据类型的硬件优化uint8,uint16,single和double可以跑得更快。
例⼦-------%这个例⼦通过%将图像旋转-1度。
I=fitsread('太阳光谱.fts');I=材料2射线(I);J=旋转(I,-1,'双线性','裁剪');图,图(I),图,imshow(J)另请参见imrotate_old、imcrop、imresize、imtransform、tformarray。
matlab旋转实现(最近邻值-双线性-三次卷积插值实现插值)
![matlab旋转实现(最近邻值-双线性-三次卷积插值实现插值)](https://img.taocdn.com/s3/m/0184261ca98271fe900ef906.png)
对图像进行旋转,使用最近邻插值法,双线性插值,三次卷积插值三种方法进行插值。
源码:clc;clear all;close all;Img=imread('test1.bmp');Img=double(Img);[h w]=size(Img);alpha=pi/6; %逆时针旋转的角度wnew=w*cos(alpha)+h*sin(alpha); %新图像的宽widthhnew=w*sin(alpha)+h*cos(alpha); %新图像的高heighthwnew=ceil(wnew); %取整hnew=ceil(hnew);u0=w*sin(alpha); %平移量T=[cos(alpha),sin(alpha);-sin(alpha),cos(alpha)]; %变换矩阵Imgnew1=zeros(hnew,wnew);Imgnew2=zeros(hnew,wnew);Imgnew3=zeros(hnew,wnew);for u=1:hnew %u和v是新图像坐标,变换到原图像坐标x和y中。
for v=1:wnewtem=T*([u;v]-[u0;0]);x=tem(1);y=tem(2);if x>=1 & x<=h & y>=1 & y<=w %若变换出的x和y在原图像范围内x_low=floor(x);x_up=ceil(x);y_low=floor(y);y_up=ceil(y);if (x-x_low)<=(x_up-x) %采用最近点法,选取距离最近点的像素赋给新图像 x=x_low;elsex=x_up;endif (y-y_low)<=(y_up-y)y=y_low;elsey=y_up;endp1=Img(x_low,y_low); %双线性插值,p1到p4是(x,y)周围的四个点 p2=Img(x_up,y_low);p3=Img(x_low,y_low);p4=Img(x_up,y_up);s=x-x_low;t=y-y_low;Imgnew1(u,v)=Img(x,y);Imgnew2(u,v)=(1-s)*(1-t)*p1+(1-s)*t*p3+(1-t)*s*p2+s*t*p4;endif x>=2 & x<=h-2 & y>=2 & y<=w-2 %若变换出的x和y在原图像范围内x_1=floor(x)-1;x_2=floor(x);x_3=floor(x)+1;x_4=floor(x)+2;y_1=floor(y)-1;y_2=floor(y);y_3=floor(y)+1;y_4=floor(y)+2;A=[sw(1+x-x_2),sw(x-x_2),sw(1-(x-x_2)),sw(2-(x-x_2))];C=[sw(1+y-y_2),sw(y-y_2),sw(1-(y-y_2)),sw(2-(y-y_2))];B=[ Img(x_1,y_1),Img(x_1,y_2),Img(x_1,y_3),Img(x_1,y_4);Img(x_2,y_1),Img(x_2,y_2),Img(x_2,y_3),Img(x_2,y_4);Img(x_3,y_1),Img(x_3,y_2),Img(x_3,y_3),Img(x_3,y_4);Img(x_4,y_1),Img(x_4,y_2),Img(x_4,y_3),Img(x_4,y_4)]; Imgnew3(u,v)=A*B*C';endendendsubplot(2,2,1),imshow(Img,[]),title('原图');subplot(2,2,2),imshow(Imgnew1,[]),title('最近邻插值法'); subplot(2,2,3),imshow(Imgnew2,[]),title('双线性插值法'); subplot(2,2,4),imshow(Imgnew3,[]),title('三次卷积插值法');欢迎您的下载,资料仅供参考!致力为企业和个人提供合同协议,策划案计划书,学习资料等等打造全网一站式需求。
Matlab线性插值
![Matlab线性插值](https://img.taocdn.com/s3/m/4e35722949649b6649d747af.png)
Matlab线性插值已知离散点上的数据集,即已知在点集X上对应的函数值Y,构造一个解析函数(其图形为一曲线)通过这些点,并能够求出这些点之间的值,这一过程称为一维插值.MATLAB命令:yi=interp1(X, Y, xi,method)该命令用指定的算法找出一个一元函数,然后以给出xi处的值。
xi可以是一个标量,也可以是一个向量,是向量时,必须单调,method可以下列方法之一:’nearest’:最近邻点插值,直接完成计算;'spline':三次样条函数插值;'linear’:线性插值(缺省方式),直接完成计算;’cubic':三次函数插值;对于[min{xi},max{xi}]外的值,MATLAB使用外推的方法计算数值。
下面是第一个例子:表一室内温度随时间的变化用三次样条插值、三次插值、线性插值、最近邻点插值分别求出表一中室内6:30—17:30之间每隔2h各点的近似温度,并对四种插值方法下的结果进行比较。
t=6:2:18;T=[18。
0 20。
0 22.0 25。
0 30。
0 28.0 24.0];tt=6.5:2:17。
5;%使用不同的方法进行一维插值yi_spline=interp1(t,T,tt,'spline’) %三次样条插值yi_cubic=interp1(t,T,tt,’cubic') %三次多项式插值yi_linear=interp1(t,T,tt)%线性插值yi_nearest=interp1(t,T,tt,'nearest’) %最近邻点插值%绘制图像进行对比plot(t,T,’ko');grid on;hold on;plot(tt,yi_spline,'b',tt,yi_cubic,’g’,tt,yi_linear,'r-',tt,yi_nearest,’k’);legend('原始数据',’三次样条插值’,'三次插值',’线性插值’,’最近邻点插值’,2);xlabel('时间/t');ylabel(’室内温度(T)/摄氏度’);title('四种插值方法的比较 ')结果:yi_spline =18.5020 20。
【matlab】绘制双三次插值函数曲线
![【matlab】绘制双三次插值函数曲线](https://img.taocdn.com/s3/m/edd24653a9956bec0975f46527d3240c8447a16c.png)
【matlab】绘制双三次插值函数曲线想要的效果:编程时要⽤到分段函数曲线的绘制⽅法:..+.*(分段条件)。
需要注意的是:函数表达式中的乘除和乘⽅都要加“.”。
因为⼀般的函数都是数在乘变量运算。
x=-2:0.001:2;a=-0.5;w=abs(x);y=(1.5.*w.^3-2.5.*w.^2+1).*(w<=1)+(-0.5.*w.^3+2.5.*w.^2-4.*w+2).*(w>1&w<=2);plot(x,y);box off;view([190]);xlabel('w');ylabel('S(w)');然后想将坐标轴变⼀下:新建⼀个xyplot.m⽂件:function xyplot(x,y)% xyplot Plot 2D axes through the origin% Example 1:% t = linspace(0,2*pi,500);% y1 = 80*sin(t);% y2 = 100*cos(t);% xyplot(t,[y1;y2])%% Example 2:% x = -2*pi:pi/10:2*pi;% y = sin(x);% plot(x,y)% xyplot% PLOTif nargin>0if nargin == 2plot(x,y);elsedisplay('Not 2D Data set!')endendhold on;% GET TICKSX=get(gca,'Xtick');Y=get(gca,'Ytick');% GET LABELSXL=get(gca,'XtickLabel');YL=get(gca,'YtickLabel');% GET OFFSETSXoff=diff(get(gca,'XLim'))./40;Yoff=diff(get(gca,'YLim'))./40;% DRAW AXIS LINEsplot(get(gca,'XLim'),[00],'k');plot([00],get(gca,'YLim'),'k');% Plot new ticksfor i=1:length(X)plot([X(i) X(i)],[0 Yoff],'-k');end;for i=1:length(Y)plot([Xoff, 0],[Y(i) Y(i)],'-k');end;% ADD LABELStext(X,zeros(size(X))-2.*Yoff,XL);text(zeros(size(Y))-3.*Xoff,Y,YL);box off;% axis square;axis off;set(gcf,'color','w');重新调⽤运⾏即可:x=-2:0.001:2;a=-0.5;w=abs(x);y=(1.5.*w.^3-2.5.*w.^2+1).*(w<=1)+(-0.5.*w.^3+2.5.*w.^2-4.*w+2).*(w>1&w<=2);xyplot(x,y);。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
对图像进行旋转,使用最近邻插值法,双线性插值,三次卷积插值三种方法进行插值。
源码:
clc;clear all;close all;
Img=imread('test1.bmp');
Img=double(Img);
[h w]=size(Img);
alpha=pi/6; %逆时针旋转的角度
wnew=w*cos(alpha)+h*sin(alpha); %新图像的宽width
hnew=w*sin(alpha)+h*cos(alpha); %新图像的高heighth
wnew=ceil(wnew); %取整
hnew=ceil(hnew);
u0=w*sin(alpha); %平移量
T=[cos(alpha),sin(alpha);-sin(alpha),cos(alpha)]; %变换矩阵
Imgnew1=zeros(hnew,wnew);
Imgnew2=zeros(hnew,wnew);
Imgnew3=zeros(hnew,wnew);
for u=1:hnew %u和v是新图像坐标,变换到原图像坐标x和y中。
for v=1:wnew
tem=T*([u;v]-[u0;0]);
x=tem(1);
y=tem(2);
if x>=1 & x<=h & y>=1 & y<=w %若变换出的x和y在原图像范围内
x_low=floor(x);
x_up=ceil(x);
y_low=floor(y);
y_up=ceil(y);
if (x-x_low)<=(x_up-x) %采用最近点法,选取距离最近点的像素赋给新图像x=x_low;
else
x=x_up;
end
if (y-y_low)<=(y_up-y)
y=y_low;
else
y=y_up;
end
p1=Img(x_low,y_low); %双线性插值,p1到p4是(x,y)周围的四个点p2=Img(x_up,y_low);
p3=Img(x_low,y_low);
p4=Img(x_up,y_up);
s=x-x_low;
t=y-y_low;
Imgnew1(u,v)=Img(x,y);
Imgnew2(u,v)=(1-s)*(1-t)*p1+(1-s)*t*p3+(1-t)*s*p2+s*t*p4;
end
if x>=2 & x<=h-2 & y>=2 & y<=w-2 %若变换出的x和y在原图像范围内x_1=floor(x)-1;
x_2=floor(x);
x_3=floor(x)+1;
x_4=floor(x)+2;
y_1=floor(y)-1;
y_2=floor(y);
y_3=floor(y)+1;
y_4=floor(y)+2;
A=[sw(1+x-x_2),sw(x-x_2),sw(1-(x-x_2)),sw(2-(x-x_2))];
C=[sw(1+y-y_2),sw(y-y_2),sw(1-(y-y_2)),sw(2-(y-y_2))];
B=[ Img(x_1,y_1),Img(x_1,y_2),Img(x_1,y_3),Img(x_1,y_4);
Img(x_2,y_1),Img(x_2,y_2),Img(x_2,y_3),Img(x_2,y_4);
Img(x_3,y_1),Img(x_3,y_2),Img(x_3,y_3),Img(x_3,y_4);
Img(x_4,y_1),Img(x_4,y_2),Img(x_4,y_3),Img(x_4,y_4)];
Imgnew3(u,v)=A*B*C';
end
end
end
subplot(2,2,1),imshow(Img,[]),title('原图');
subplot(2,2,2),imshow(Imgnew1,[]),title('最近邻插值法'); subplot(2,2,3),imshow(Imgnew2,[]),title('双线性插值法'); subplot(2,2,4),imshow(Imgnew3,[]),title('三次卷积插值法');。