MATLAB几何变换实验报告
Matlab实验报告(三)-MATLAB绘图

实验目的1.掌握MATLAB的基本绘图命令。
2.掌握运用MATLAB绘制一维、二维、三维图形的方法.3.给图形加以修饰。
一、预备知识1.基本绘图命令plotplot绘图命令一共有三种形式:⑴plot(y)是plot命令中最为简单的形式,当y为向量时,以y的元素为纵坐标,元素相应的序列号为横坐标,绘制出连线;若y为实矩阵,则按照列绘出每列元素和其序列号的对应关系,曲线数等于矩阵的列数;当y为复矩阵时,则按列以每列元素的实部为横坐标,以虚部为纵坐标,绘出曲线,曲线数等于列数。
⑵ plot(x,y,[linspec])其中linspec是可选的,用它来说明线型。
当x和y为同维向量时,以x为横坐标,y为纵坐标绘制曲线;当x是向量,y是每行元素数目和x维数相同的矩阵时,将绘出以x为横坐标,以y中每行元素为纵坐标的多条曲线,曲线数等于矩阵行数;当x为矩阵,y为相应向量时,使用该命令也能绘出相应图形。
⑶ plot(x1,y1,x2,y2,x3,y3……)能够绘制多条曲线,每条曲线分别以x和y为横纵坐标,各条曲线互不影响。
线型和颜色MATLAB可以对线型和颜色进行设定,线型和颜色种类如下:线:—实线:点线 -.虚点线——折线点:.圆点 +加号 *星号 x x型 o 空心小圆颜色:y 黄 r 红 g 绿 b 蓝 w 白 k 黑 m 紫 c 青特殊的二维图形函数表5 特殊2维绘图函数[1] 直方图在实际中,常会遇到离散数据,当需要比较数据、分析数据在总量中的比例时,直方图就是一种理想的选择,但要注意该方法适用于数据较少的情况。
直方图的绘图函数有以下两种基本形式。
·bar(x,y) 绘制m*n 矩阵的直方图.其中y 为m *n 矩阵或向量,x 必须单向递增。
·bar(y) 绘制y 向量的直方图,x 向量默认为x=1:m close all; %关闭所有的图形视窗。
x=1:10;y=rand (size(x )); bar(x,y ); %绘制直方图.123456789100.51Bar()函数还有barh ()和errorbar ()两种形式,barh()用来绘制水平方向的直方图,其参数与bar()相同,当知道资料的误差值时,可用errorbar ()绘制出误差范围,其一般语法形式为:errorbar (x,y,l,u)其中x,y 是其绘制曲线的坐标,l ,u 是曲线误差的最小值和最大值,制图时,l 向量在曲线下方,u 向量在曲线上方。
matlab图像的几何变换

实验三 图像的几何运算一、实验目的1、 理解几何运算的基本概念与定义;2、 掌握在MA TLAB 中进行插值的方法3、 运用MATLAB 语言进行图像的插值缩放和插值旋转。
二、实验原理插值是常用的数学运算,通常是利用曲线拟合的方法,通过离散的采样点建立一个连续函数来逼近真实的曲线,用这个重建的函数便可以求出任意位置的函数值。
最近邻插值是最简便的插值,在这种算法中,每一个插值输出像素的值就是在输入图像中与其最临近的采样点的值。
该算法的数学表示为:()()k f x f x = 如果1111()()22k k k k x x x x x -++<<+ 最近邻插值是工具箱函数默认使用的插值方法,而且这种插值方法的运算量非常小。
不过,当图像中包含像素之间灰度级变化的细微结构时,最近邻插值法会在图像中产生人工的痕迹。
双线性插值法的输出像素值是它在输入图像中2×2领域采样点的平均值,它根据某像素周围4个像素的灰度值在水平和垂直两个方向上对其插值。
设''''1,1,,m i m n j n a i m b j n <<+<<+=-=-,'i 和'j 是要插值点的坐标,则双线性插值的公式为:''(,)(1)(1)(,)(1)(1,)(1)(,1)(1,1)g i j a b g m n a b g m n a bg m n abg m n =--+-++-++++ 双三次插值的插值核为三次函数,其插值邻域的大小为4×4。
它的插值效果比较好,但相应的计算量也比较大,在这里不做讨论。
1、图像的缩放imresize 函数的语法格式为:B = imresize(A, m, method)2、图像的旋转imrotate 的语法格式为:B = imrotate(A, angle, method)三、实验内容及要求1. 读出girl.bmp 图像并显示。
(最新版)MATLAB实验报告

(最新版)MATLAB实验报告实验一典型环节的MATLAB仿真一、实验目的1.熟悉MATLAB桌面和命令窗口,初步了解SIMULINK功能模块的使用方法。
2.通过观察典型环节在单位阶跃信号作用下的动态特性,加深对各典型环节响应曲线的理解。
3.定性了解各参数变化对典型环节动态特性的影响。
二、SIMULINK的使用MATLAB中SIMULINK是一个用来对动态系统进行建模、仿真和分析的软件包。
利用SIMULINK功能模块可以快速的建立控制系统的模型,进行仿真和调试。
1.运行MATLAB软件,在命令窗口栏“>>”提示符下键入simulink命令,按Enter 键或在工具栏单击按钮,即可进入如图1-1所示的SIMULINK仿真环境下。
2.选择File菜单下New下的Model命令,新建一个simulink 仿真环境常规模板。
3.在simulink仿真环境下,创建所需要的系统。
以图1-2所示的系统为例,说明基本设计步骤如下:1)进入线性系统模块库,构建传递函数。
点击simulink下的“Continuous”,再将右边窗口中“Transfer Fen”的图标用左键拖至新建的“untitled”窗口。
2)改变模块参数。
在simulink仿真环境“untitled”窗口中双击该图标,即可改变传递函数。
其中方括号内的数字分别为传递函数的分子、分母各次幂由高到低的系数,数字之间用空格隔开;设置完成后,选择OK,即完成该模块的设置。
3)建立其它传递函数模块。
按照上述方法,在不同的simulink 的模块库中,建立系统所需的传递函数模块。
例:比例环节用“Math”右边窗口“Gain”的图标。
4)选取阶跃信号输入函数。
用鼠标点击simulink下的“Source”,将右边窗口中“Step”图标用左键拖至新建的“untitled”窗口,形成一个阶跃函数输入模块。
5)选择输出方式。
用鼠标点击simulink下的“Sinks”,就进入输出方式模块库,通常选用“Scope”的示波器图标,将其用左键拖至新建的“untitled”窗口。
高等数学:MATLAB实验

MATLAB实验
2.fplot绘图命令 fplot绘图命令专门用于绘制一元函数曲线,格式为:
fplot('fun',[a,b]) 用于绘制区间[a,b]上的函数y=fun的图像.
MATLAB实验 【实验内容】
MATLAB实验
由此可知,函数在点x=3处的二阶导数为6,所以f(3)=3为 极小值;函数在点x= 1处的二阶导数为-6,所以f(1)=7为极大值.
MATLAB实验
例12-10 假设某种商品的需求量q 是单价p(单位:元)的函 数q=12000-80p,商 品的总成本C 是需求量q 的函数 C=25000+50q.每单位商品需要纳税2元,试求使销售 利润达 到最大的商品单价和最大利润额.
MATLAB实验
MATLAB实验
MATLAB实验
MATLAB实验
MATLAB实验
MATLAB实验
MATLAB实验
MATLAB实验
MATLAB实验 实验九 用 MATLAB求解二重积分
【实验目的】 熟悉LAB中的int命令,会用int命令求解简单的二重积分.
MATLAB实验
【实验M步A骤T】 由于二重积分可以化成二次积分来进行计算,因此只要
MATLAB实验
MATLAB实验
MATLAB实验
MATLAB实验
MATLAB实验
实验七 应用 MATLAB绘制三维曲线图
【实验目的】 (1)熟悉 MATLAB软件的绘图功能; (2)熟悉常见空间曲线的作图方法.
【实验要求】 (1)掌握 MATLAB中绘图命令plot3和 mesh的使用; (2)会用plot3和 mesh函数绘制出某区间的三维曲线,线型
实验一 MATLAB_图像处理实验报告

实验一 MATLAB_图像处理实验报告实验报告课程名称数字图像处理实验名称图像的几何变换姓名__吴征宇学号____ 3101110002 专业班级_ 实验日期__20XX_ 年_10 _月_18 日成绩_____ __ 指导教师___ _一、实验目的掌握图像平移、缩放、旋转与镜像变换;二、实验原理图像平移,自写平移函数function outImage=immove(inImage,Tx,Ty) [m, n] = size(inImage);%计算图象大小outImage = uint8(zeros(m+abs(Ty), n+abs(Tx))); if(Tx>0&&Ty>0) %往右下角平移的情况outImage(1+Ty:m+Ty,1+Tx:n+Tx) = inImage; else if(Tx0) %往左下角平移的情况outImage(1+Ty:m+Ty,1:n) = inImage; else % 往右上角平移的情况outImage(1:m,1+Tx:n+Tx) = inImage; end endend 主函数I=imread('C:\\Documents and Settings\\student\\桌面\\'); J=rgb2gray(I);imshow(J);title('原图像'); H=immove(J,100,-100);figure;imshow(H);title('平移后图像'); B=immove(J,80,-50);figure;imshow(B);title('平移后图像'); G=imresize(J,);figure;imshow(G);title('缩放后图像'); C=imresize(J,2);figure;imshow(C);title('缩放后图像'); D=imrotate(J,30);figure;imshow(D);title('旋转后图像'); E=imrotate(J,54);figure;imshow(E);title('旋转后图像'); F = flipdim(J,1);figure;imshow(F);title('垂直镜像图像'); G = flipdim(J,2);figure;imshow(G);title('水平镜像图像');三、实验环境Window 20XX Matlab1.利用imread( )函数读取一幅图像,假设其名为,存入一个数组中;a=imread('')2.利用whos 命令提取该读入图像的基本信息;3.利用imshow 函数来显示这幅图像;4.利用imfinfo函数来获取图像文件的压缩,颜色等等其他的详细信息;5.利用imwrite 函数来压缩这幅图象,将其保存为一幅压缩了像素的jpg文件,设为;语法:imwrite(原图像,新图像,‘quality’,q), q取0-100。
实验报告几何变换实验

实验报告几何变换实验实验报告:几何变换实验引言:几何变换是计算机图形学中的重要概念,它可以改变图像的形状、位置和大小。
在本次实验中,我们将通过对几何变换的实际操作,深入了解几何变换的原理和应用。
一、实验目的本次实验的主要目的是探究几何变换在图像处理中的应用,具体包括平移、旋转、缩放和翻转等几何变换操作。
通过实际操作和观察,我们将了解几何变换对图像的影响,并学习如何使用计算机编程实现这些变换。
二、实验材料和方法1. 实验材料:- 一台计算机- 图像处理软件(如Photoshop、GIMP等)- 编程软件(如Python、MATLAB等)2. 实验方法:- 步骤一:选择一张图片作为实验对象,并导入到图像处理软件中。
- 步骤二:使用图像处理软件进行平移操作,观察图像的位置变化。
- 步骤三:使用图像处理软件进行旋转操作,观察图像的旋转效果。
- 步骤四:使用图像处理软件进行缩放操作,观察图像的大小变化。
- 步骤五:使用图像处理软件进行翻转操作,观察图像的翻转效果。
- 步骤六:使用编程软件编写程序,实现上述几何变换操作,并观察结果。
三、实验结果与分析1. 平移操作:在实验中,我们发现通过平移操作,可以将图像在水平和垂直方向上进行移动。
通过调整平移的距离和方向,我们可以改变图像在画布上的位置。
这种操作常用于图像的对齐和拼接等应用中。
2. 旋转操作:旋转操作可以改变图像的角度和方向。
通过调整旋转的角度和中心点,我们可以使图像以不同的角度进行旋转。
这种操作常用于图像的矫正、仿射变换等应用中。
3. 缩放操作:缩放操作可以改变图像的大小。
通过调整缩放的比例,我们可以使图像变得更大或更小。
这种操作常用于图像的放大、缩小、裁剪等应用中。
4. 翻转操作:翻转操作可以改变图像的方向。
通过水平或垂直翻转,我们可以使图像在左右或上下方向发生镜像反转。
这种操作常用于图像的镜像处理、对称效果等应用中。
四、实验总结通过本次实验,我们深入了解了几何变换在图像处理中的应用。
matlab 图像的几何变换与彩色处理

实验四、图像的几何变换与彩色处理一、实验目的1理解和掌握图像的平移、垂直镜像变换、水平镜像变换、缩放和旋转的原理和应用;2熟悉图像几何变换的MATLAB操作和基本功能3 掌握彩色图像处理的基本技术二、实验步骤1 启动MATLAB程序,读入图像并对图像文件分别进行平移、垂直镜像变换、水平镜像变换、缩放和旋转操作%%%%%%平移>> flowerImg=imread('flower.jpg');>> se=translate(strel(1),[100 100]);>> img2=imdilate(flowerImg,se);>> subplot(1,2,1);>> imshow(flowerImg);>> subplot(1,2,2);>> imshow(img2);I1=imread('flower.jpg');I1=double(I1);H=size(I1);I2(1:H(1),1:H(2),1:H(3))=I1(H(1):-1:1,1:H(2),1:H(3)); I3(1:H(1),1:H(2),1:H(3))=I1(1:H(1),H(2):-1:1,1:H(3)); Subplot(2,2,1);Imshow(uint8(I1));Title('原图');Subplot(2,2,2);Imshow(uint8(I3));Title('水平镜像');Subplot(2,2,3);Imshow(uint8(I2));Title('垂直镜像');img1=imread('flower.jpg');figure,imshow(img1);%%%%%%缩放img2=imresize(img1,0.25);figure,imshow(img2);imwrite(img2,'a2.jpg');%%%%%%旋转img3=imrotate(img1,90); figure,imshow(img3); imwrite(img3,'a3.jpg');2 实验如下操作:(1)改变图像缩放比例f= imread('flower.jpg');T=[ 0.5 0 0; 0 0.5 0; 0 0 1];tform=maketform('affine',T);[g1,xdata1,ydata1]=imtransform(f,tform,'FillValue',255);T=[ 1 0 0; 0 1 0; 0 0 1];tform=maketform('affine',T);[g2,xdata2,ydata2]=imtransform(f,tform,'FillValue',255);T=[ 1.5 0 0; 0 1.5 0; 0 0 1];tform=maketform('affine',T);[g3,xdata3,ydata3]=imtransform(f,tform,'FillValue',255);hold onimshow(g3,'XData', xdata3, 'YData', ydata3)hold onimshow(g2,'XData', xdata2, 'YData', ydata2)hold onimshow(g1,'XData', xdata1, 'YData', ydata1)axis autoaxis on(2)改变图像的旋转角度,f= imread('flower.jpg');theta=3*pi/4;T=[cos(theta) sin(theta) 0; -sin(theta) cos(theta) 0; 0 0 1]; tform=maketform('affine',T);[g3,xdata3,ydata3]=imtransform(f,tform,'FillValue',255); theta=pi;T=[cos(theta) sin(theta) 0; -sin(theta) cos(theta) 0; 0 0 1]; tform=maketform('affine',T);[g4,xdata4,ydata4]=imtransform(f,tform,'FillValue',255); imshow(f);hold onimshow(g3,'XData', xdata3, 'YData', ydata3)hold onimshow(g4,'XData', xdata4, 'YData', ydata4)axis autoaxis on观察变换结果,要求把经过不同类型几何变换的图像和原图像在同一坐标系内显示输出(请参考课件或教材上的代码)3 读入一幅彩色图像,进行如下图像处理:(1)在RGB彩色空间中对图像进行模糊和锐化处理rgb= imread('flower.jpg');figure; imshow(rgb); title('原图');%平滑滤波r=rgb(:,:,1);g=rgb(:,:,2);b=rgb(:,:,3);m=fspecial('average',[8,8]);r_filtered=imfilter(r,m);g_filtered=imfilter(g,m);b_filtered=imfilter(b,m);rgb_filtered=cat(3,r_filtered,g_filtered,b_filtered);figure; imshow(rgb_filtered); title('模糊后');imwrite(rgb_filtered, 'RGB彩色空间模糊后.jpg');%拉普拉斯lapMatrix=[1 1 1;1 -8 1;1 1 1];i_tmp=imfilter(rgb,lapMatrix,'replicate');i_sharped=imsubtract(rgb,i_tmp);figure; imshow(i_sharped); title('锐化后'); imwrite(i_sharped, 'RGB彩色空间锐化后.jpg');(2)在HSI彩色空间中,对H分量图像进行模糊和锐化处理,转换回RGB格式并观察效果(3)在HSI彩色空间中,对S分量图像进行模糊和锐化处理,转换回RGB格式并观察效果(4)在HSI彩色空间中,对I分量图像进行模糊和锐化处理,转换回RGB格式并观察效果fc = imread('flower.jpg');h = rgb2hsi(fc);H = h (:,:,1);S = h (:,:,2);I = h (:,:,3);subplot(3,3,1);imshow(fc); title('原图');%平滑滤波m=fspecial('average',[8,8]);h_filtered=imfilter(H,m);img_h_filtered = cat(3,h_filtered,S,I);rgb_h_filtered = hsi2rgb(img_h_filtered);subplot(3,3,2);imshow(rgb_h_filtered); title('H分量模糊后');imwrite(rgb_h_filtered, 'H分量模糊后.jpg');%拉普拉斯lapMatrix=[1 1 1;1 -8 1;1 1 1];i_tmp=imfilter(H,lapMatrix,'replicate');H_sharped=imsubtract(H,i_tmp);img_h_sharped = cat(3,H_sharped,S,I);rgb_h_sharped = hsi2rgb(img_h_sharped);subplot(3,3,3); imshow(rgb_h_sharped); title('H分量锐化后'); imwrite(rgb_h_sharped, 'H分量锐化后.jpg');subplot(3,3,4);imshow(fc); title('原图');%平滑滤波m=fspecial('average',[8,8]);s_filtered=imfilter(S,m);img_s_filtered = cat(3,H,s_filtered,I);rgb_s_filtered = hsi2rgb(img_s_filtered);subplot(3,3,5);imshow(rgb_s_filtered); title('S分量模糊后'); imwrite(rgb_s_filtered, 'S分量模糊后.jpg');%拉普拉斯lapMatrix=[1 1 1;1 -8 1;1 1 1];i_tmp=imfilter(S,lapMatrix,'replicate');s_sharped=imsubtract(S,i_tmp);img_s_sharped = cat(3,H,s_sharped,I);rgb_s_sharped = hsi2rgb(img_s_sharped);subplot(3,3,6); imshow(rgb_s_sharped); title('S分量锐化后'); imwrite(rgb_s_sharped, 'S分量锐化后.jpg');subplot(3,3,7);imshow(fc); title('原图');%平滑滤波m=fspecial('average',[8,8]);i_filtered=imfilter(I,m);img_i_filtered = cat(3,H,S,i_filtered);rgb_i_filtered = hsi2rgb(img_i_filtered);subplot(3,3,8);imshow(rgb_i_filtered); title('I分量模糊后'); imwrite(rgb_i_filtered, 'I分量模糊后.jpg');%拉普拉斯lapMatrix=[1 1 1;1 -8 1;1 1 1];i_tmp=imfilter(I,lapMatrix,'replicate');i_sharped=imsubtract(I,i_tmp);img_i_sharped = cat(3,H,S,i_sharped);rgb_i_sharped = hsi2rgb(img_i_sharped);subplot(3,3,9); imshow(rgb_i_sharped); title('I分量锐化后'); imwrite(rgb_i_sharped, 'I分量锐化后.jpg');由图看出I分量图像进行模糊和锐化处理的效果最好。
几何变换

1.实习二、图像的几何变换一、实验目的1、掌握图像几何变换的基本原理2、掌握如何利用Matlab相应函数对图像进行几何变换(图像缩小、放大、旋转、裁剪等)3、学会自己编写简单几何变换的程序二、实验内容1、对所选图像进行缩小操作2、对所选图像进行放大操作3、对所选图像进行旋转操作三、实验过程源程序及图像:p1=imread('Azul.jpg');info=imfinfo('Azul.jpg');W=info.Width;H=info.Height;%显示原始图像figure(1);imshow(p1);%使用imresize()函数将原始图像缩小为原图形的0.5倍p2=imresize(p1,0.5);figure(2);imshow(p2);%不使用imresize()函数将原始图像缩小为原图形的0.5倍c=2;i=1:W./c;j=1:H./c;I=floor(c*i); J=floor(c*j);p3(j,i,1:3)=p1(J,I,1:3);figure(3);imshow(p3);问题:1、在进行缩小操作时出现以下错误:??? Index exceeds matrix dimensions.Error in ==> C:\MATLAB6p5\work\w3.mOn line 15 ==> p3(j,i)=p1(J,I);解决:i=1:W./c; j=1:H./c;I=floor(c*i); J=floor(c*j);p3(j,i)=p1(J,I);在变换过程中注意存放像素的数组大小应该相等2、缩小操作完成时的的图形是灰度图而非原来的真彩色图解决:在变换时应注意讲灰度图转换成真彩色图形将p3(j,i)=p1(J,I);改成p3(j,i,1:3)=p1(J,I,1:3);即可得到真彩色图形%使用imresize()函数将原始图像放大为原图形的2倍p4=imresize(p1,2);figure(4);imshow(p4);%不使用imresize()函数将原始图像放大为原图形的2倍d=0.5;x=2:floor(W./d); y=2:floor(H./d);X=floor(d*x); Y=floor(d*y);p5(y,x,1:3)=p1(Y,X,1:3);figure(5);imshow(p5);问题:3、进行放大操作时出现以下问题:??? Subscript indices must either be real positive integers or logicals. Error in ==> C:\MATLAB6p5\work\w3.mOn line 26 ==> p5(y,x,1:3)=p1(Y,X,1:3);解决:Matab数组存放下标是以1开始的不能为零,将下列第二行d=0.5;x=1:floor(W./d); y=1:floor(H./d);X=floor(d*x); Y=floor(d*y);p5(y,x,1:3)=p1(Y,X,1:3);改为:x=2:floor(W./d); y=2:floor(H./d);即可%将原始图形旋转30度显示p6=imrotate(p1,30);figure(6);imshow(p6);%编写将原始图形旋转30度显示pi=3.14; theta=30; angle=pi*theta/180;H1=floor(W*sin(angle)-cos(angle)); W1=floor(W*cos(angle)+H*sin(angle)); for y1=1:Hfor x1=1:WX1=floor((x1-H/2)*cos(angle)+(y1-W/2)*sin(angle)+H1/2+228);Y1=floor(-(x1-H/2)*sin(angle)+(y1-W/2)*cos(angle)+W1/2+1);p7(Y1,X1,1:3)=p1(y1,x1,1:3);endendfigure(7);imshow(p7);问题:4、出现的问题:??? Subscript indices must either be real positive integers or logicals.Error in ==> C:\MATLAB6p5\work\w3.mOn line 40 ==> p7(Y1,X1,1:3)=p1(y1,x1,1:3);解决:将for循环中的公式加上一个合适的正常数使计算结果中不出现零值H1=floor(W*sin(angle)-cos(angle)); W1=floor(W*cos(angle)+H*sin(angle));for y1=1:Hfor x1=1:WX1=floor((x1-H/2)*cos(angle)+(y1-W/2)*sin(angle)+H1/2+228);Y1=floor(-(x1-H/2)*sin(angle)+(y1-W/2)*cos(angle)+W1/2+1);p7(Y1,X1,1:3)=p1(y1,x1,1:3);endend%对旋转的图形进行插值计算p8=imrotate(p1,30,'bilinear');figure(8);imshow(p8);问题:与图六中未标明插值结果相同,即Matlab中使用的函数会自动对变换后的图像进行插值计算。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
作业二几何变换一、编写一个函数,实现将一幅图像旋转一定角度,以该图像中心点为旋转点。
分别使用三种插值方法。
1、原理:平移变换:x = u + δxy = v + δy旋转变换:x = ucosθ - vsinθy = usinθ + vcosθ2、源码:function wchy1(I,jiaodu,wchy)%用三种插值方法实现将一幅图像旋转一定角度%I:待处理图片名称%jiaodu:要旋转的角度,旋转方向为顺时针%wchy:插值方法,1代表最近邻插值,2代表双线性插值,3代表三次内插法img=imread(I);figure,subplot(1,2,1);imshow(img),title('原图');[h,w]=size(img);theta=jiaodu/180*pi;py=[1 0 w/2;0 1 h/2;0 0 1];rot=[cos(theta) -sin(theta) 0;sin(theta) cos(theta) 0;0 0 1];pix1=[1 1 1]*py*rot;%变换后图像左上点的坐标pix2=[1 w 1]*py*rot;%变换后图像右上点的坐标pix3=[h 1 1]*py*rot;%变换后图像左下点的坐标pix4=[h w 1]*py*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方向的负轴超出的偏移量switch wchycase 1for i=1-delta_y:height-delta_yfor j=1-delta_x:width-delta_xpix=[i j 1]/rot/py;%用变换后图像的点的坐标去寻找原图像点的坐标,否则有些变换后的图像的像素点无法完全填充if pix(1)>=1 && pix(2)>=1 && pix(1)<=h && pix(2)<=wimgn(i+delta_y,j+delta_x)=img(round(pix(1)),round(pix(2)));endendendsubplot(1,2,2),imshow(uint8(imgn)),title('最近邻插值法旋转后的图片')case 2for i=1-delta_y:height-delta_yfor j=1-delta_x:width-delta_xpix=[i j 1]/rot/py;%用变换后图像的点的坐标去寻找原图像点的坐标,%否则有些变换后的图像的像素点无法完全填充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_lef t(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));endendendsubplot(1,2,2),imshow(uint8(imgn)),title('双线性插值法旋转后的图片')case 3for i=1-delta_y:height-delta_yfor j=1-delta_x:width-delta_xpix=[i j 1]/rot/py;%用变换后图像的点的坐标去寻找原图像点的坐标,%否则有些变换后的图像的像素点无法完全填充u=pix(1)-floor(pix(1)); i1=floor(pix(1))+2;v=pix(2)-floor(pix(2));j1=floor(pix(2))+2;if pix(1)>=1 && pix(2)>=1 && pix(1) <= h-3 && pix(2) <= w-3A=[sw(1+u) sw(u) sw(1-u) sw(2-u)];C=[sw(1+v);sw(v);sw(1-v);sw(2-v)];B=[img(i1-1,j1-1) img(i1-1,j1) img(i1-1,j1+1) img(i1-1,j1+2)img(i1,j1-1) img(i1,j1) img(i1,j1+1) img(i1,j1+2)img(i1+1,j1-1) img(i1+1,j1) img(i1+1,j1+1) img(i1+1,j1+2)img(i1+2,j1-1) img(i1+2,j1) img(i1+2,j1+1) img(i1+2,j1+2)];B=double(B);imgn(i+delta_y,j+delta_x)=(A*B*C);endendendsubplot(1,2,2),imshow(uint8(imgn)),title('三次内插法旋转后的图片') endfunction 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;end3、测试:clear,clcwchy1('lena.tif',15,1) wchy1('lena.tif',30,2) wchy1('lena.tif',45,3)4、运行结果:2、编写一个函数,实现将一幅图像水平垂直偏移若干像素。
分别使用三种插值方法。
1、原理:水平偏移:x = u + shv;y=v垂直偏移:x = u;y = svu + v2、源码:function wchy2(I,sp,cz,wchy)%用三种插值方法实现将一幅图像水平垂直偏移变换%I:待处理图片名称%sp:水平偏移多少像素%cz:垂直偏移多少像素%wchy:插值方法,1代表最近邻插值,2代表双线性插值,3代表三次内插法img=imread(I);figure,subplot(1,2,1);imshow(img),title('原图');[h,w]=size(img);sh=sp/w;sv=cz/(h+sp);sp_rot=[1 sh 0;0 1 0;0 0 1];cz_rot=[1 0 0;sv 1 0;0 0 1];pix1=[1 1 1]*sp_rot*cz_rot;%变换后图像左上点的坐标pix2=[1 w 1]*sp_rot*cz_rot;%变换后图像右上点的坐标pix3=[h 1 1]*sp_rot*cz_rot;%变换后图像左下点的坐标pix4=[h w 1]*sp_rot*cz_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方向的负轴超出的偏移量switch wchycase 1for i=1-delta_y:height-delta_yfor j=1-delta_x:width-delta_xpix=[i j 1]/cz_rot/sp_rot;%用变换后图像的点的坐标去寻找原图像点的坐标,否则有些变换后的图像的像素点无法完全填充if pix(1)>=1 && pix(2)>=1 && pix(1)<=h && pix(2)<=wimgn(i+delta_y,j+delta_x)=img(round(pix(1)),round(pix(2)));endendendsubplot(1,2,2),imshow(uint8(imgn)),title('最近邻插值法偏移后的图片')case 2for i=1-delta_y:height-delta_yfor j=1-delta_x:width-delta_xpix=[i j 1]/cz_rot/sp_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_lef t(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));endendendsubplot(1,2,2),imshow(uint8(imgn)),title('双线性插值法偏移后的图片')case 3for i=1-delta_y:height-delta_yfor j=1-delta_x:width-delta_xpix=[i j 1]/cz_rot/sp_rot;%用变换后图像的点的坐标去寻找原图像点的坐标,%否则有些变换后的图像的像素点无法完全填充u=pix(1)-floor(pix(1)); i1=floor(pix(1))+2;v=pix(2)-floor(pix(2));j1=floor(pix(2))+2;if pix(1)>=1 && pix(2)>=1 && pix(1)<=h-4 && pix(2)<=w-4A=[sw(1+u) sw(u) sw(1-u) sw(2-u)];C=[sw(1+v);sw(v);sw(1-v);sw(2-v)];B=[img(i1-1,j1-1) img(i1-1,j1) img(i1-1,j1+1) img(i1-1,j1+2)img(i1,j1-1) img(i1,j1) img(i1,j1+1) img(i1,j1+2)img(i1+1,j1-1) img(i1+1,j1) img(i1+1,j1+1) img(i1+1,j1+2)img(i1+2,j1-1) img(i1+2,j1) img(i1+2,j1+1) img(i1+2,j1+2)];B=double(B);imgn(i+delta_y,j+delta_x)=(A*B*C);endendendsubplot(1,2,2),imshow(uint8(imgn)),title('三次内插法偏移后的图片') endfunction 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;end3、测试:clear,clcwchy2('Fig0237.tif',20,200,1) wchy2('Fig0237.tif',20,200,2) wchy2('Fig0237.tif',20,200,3)4、运行结果:。