分形插值算法和MATLAB实验

合集下载

用MATLAB实现拉格朗日插值和分段线性插值

用MATLAB实现拉格朗日插值和分段线性插值

用MATLAB真止推格朗日插值战分段线性插值之阳早格格创做1、真验真质:用MATLAB真止推格朗日插值战分段线性插值.2、真验手段:1)教会使用MATLAB硬件;2)会使用MATLAB硬件举止推格朗日插值算法战分段线性好值算法;3、真验本理:利用推格朗日插值要领举止多项式插值,并将图形隐式出去.4、真验步调及运止截止(1)真止lagrange插值1)定义函数:f = 1/(x^2+1) 将其保存正在f.m 文献中,简直步调如下:function y = f1(x)y = 1./(x.^2+1);2)定义推格朗日插值函数:将其保存正在lagrange.m 文献中,简直真止步调编程如下:function y = lagrange(x0,y0,x)m = length(x); /区间少度/n = length(x0);for i = 1:nl(i) = 1;endfor i = 1:mfor j = 1:nfor k = 1:nif j == kcontinue;endl(j) = ( x(i) -x0(k))/( x0(j) - x0(k) )*l(j);endendendy = 0;for i = 1:ny = y0(i) * l(i) + y;end3)修坐尝试步调,保存正在text.m文献中,真止绘图:x=-5:0.001:5;y=(1+x.^2).^-1;p=polyfit(x,y,n);py=vpa(poly2sym(p),10)plot_x=-5:0.001:5;f1=polyval(p,plot_x);figureplot(x,y,‘r',plot_x,f1)输进n=6,出现底下的图形:通过上图不妨瞅到当n=6是不很佳的模拟.于是沉新运止text.M并采用n=11由此可睹n=11时的图像是不妨很佳的真止模拟(2)分段线性插值:修坐div_linear.m文献.简直编程如下/*分段线性插值函数:div_linear.m 文献*/function y = div_linear(x0,y0,x,n)%for j = 1:length(x)for i = 1:n-1if (x >= x0(i)) && (x <= x0(i+1))y = (x - x0(i+1))/(x0(i) - x0(i+1))*y0(i) + ( x - x0(i))/(x0(i+1) - x0(i))*y0(i+1);elsecontinue;endend%end尝试步调(text2.m):n = input(‘输进n =:’);x0 = linspace( -5,5,n);for x = -5:0.01:5y = div_linear(x0,f(x0),x,n);hold on;plot(x,y,'r');plot(x,f(x),'b');end2)运止尝试步调,那是会出现:输进n=:2)输进n=6,并按Enter键,出现:4)闭掉图形界里后,沉新运止步调,输进n=11,并按enter键后出现:5)再次闭掉图形界里,输进n=100,并按enter键,出现:此时.图形将于本函数图形基础符合,证明分隔区间越多,图像交近真正在的图像.(3)用lagrange插值瞅察y = |si n(k*π*x)|的缺点分解:1)编写函数文献,保存正在f2.m 中x=0:0.01:1;k= input('输进k:')n= input('输进n:');y=abs(sin(k*pi*x));p=polyfit(x,y,n-1);py=vpa(poly2sym(p),8);plot_x=0:0.01:1;f1=polyval(p,plot_x);plot(x,y,plot_x,f1);2)运止该步调:输进k=:1输进n=:2出现如下图形界里:闭掉图形界里后沉新运止f2.m,输进k=:1,n=:3出现如下界里:再次闭掉图形界里,输进k=:1,n=:6 后出现:此时图形基础符合.类推,输进k=2,n=3后出现:k =2, n =11,出现如下图形:k =2,n =15,那时出现:k =2,n =19,出现:当k=2,n=21时,图形如下:此时基础符合.5、真验归纳:通过本次课程安排,尔发端掌握了MATLAB使用,加深了对付于百般线性插值的明白;培植了独力处事本领战创制力;概括使用博业及前提知识,办理本质数教问题的本领;正在本次课程安排中,正在教授的粗心指挥下,支益匪浅.共时对付数教的钻研有了更深进的认识.。

Matlab插值

Matlab插值
(1)画出散点图;
(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实验报告六(三次样条与分段线性插值)范文
1.分析问题
本题是给出粗略等分点让你插入更多点用双线性插值法来作出更清晰的山区地貌图。
2.问题求解
x=0:400:2800;
y=0:400:2400;
z=[1430 1450 1470 1320 1280 1200 1080 940;
1450 1480 1500 1550 1510 1430 1300 1200;
2.分段线性插值与计算量与n无关;n越大,误差越小.
3.三次样条插值比分段线性插值更光滑。
4.‘linear’:分段线性插值;‘spline’:三次样条值。
【实验环境】
MatlabR2010b
二、实验内容
问题1对函数 ,x[-5,5],分别用分段线性插值和三次样条插值作插值(其中插值节点不少于20),并分别作出每种插值方法的误差曲线.
本次实验因为是我们课本没有的内容,心理上给了我很大的压力,幸好我们还能根据老师的课件以及例题去掌握这次实验所需要的各种插值法,但结果还好,两道题都做出来了。
plot(x,y,'*',x1,yl,'r',x1,y2,'b')
y0=1./(1+x1.^2);
y3=yl-y0;
y4=ys-y0;
holdon
plot(x1,y3,'y',x1,y4,'g')
3.结果
4误。
问题2山区地貌图在某山区(平面区域(0,2800)(0,2400)内,单位:米)测得一些地点的高程(单位:米)如表1,试作出该山区的地貌图.
1.分析问题
本题先取出少量的插值节点并作出图形,再用分段线性插值法和三次样条插值法做出更精确的图形,最后在作出误差曲线。

基于MatLab整体线性分形插值的研究

基于MatLab整体线性分形插值的研究

传统的插值方法 ( ar g 插值法、 L g ne a 样条插值 法等) 对平稳数据和光滑 曲线 的插值拟合是 有效
的, 但对剧烈震荡 曲线与数据效果就不理想。96 18 年, a s y B r l 在文【 ne 6 中引入分形插值 函数 , 从而为 这类曲线与数据的插值拟合提出了一种新的思路。 分形插值是依据迭代 函数系统 (F )的吸引子而 IS 建立起来 的, 由于分形插值函数的盒维数可以介于 1 到2之间的任意数值 , 因此 , 分形插值函数不仅可 以用来拟合光滑数据或曲线 , 更可以在震荡剧烈的 离散数据或曲线 中显示其独特的优越性。 这其 中如 何有效地估计其逼近的误差 , 如何分析垂直 比例因 子对插值拟合精度的影响 , 是本文所关心的问题 。

13确定系数与垂直 比例因子 d J . 0 现构造一迭代函数系统 { ii ,, N K: , =12 …, } 如( ) , 3 式 使得这个迭代函数 系的吸引子等于插值 函数 fX 的 图像 , 么 由( )一( ) () 那 1 3 式可得 系数 a, c d, ,满足如下方程 i , e‘
{ : , = 12 …, } 的 不 变 集 , K i i ,, N 即 G =
u l ( ) 并 fx)=Y, =12 …, , ;G , (; ; i ,, N 我们称这 样的 f 是对应于{ : , =12 …, 的分形插值 K ; i ,, N}
函数 ( 简称 FF 。 I) 设HK ( )表示 K的所有非空紧子集组成的集
直比例 因子, 可以近似地构造 出原 曲线, 在此逼近计算的过程 中, 出了一种 易实现的分形 给
插 值误差计 算方 法 , 并基 于 MaL b说 明 了整体 线性 分 形插 值 的 实现过 程 。 时提 出 了粒 子 ta 同

插值法与MATLAB应用

插值法与MATLAB应用

插值法与MATLAB应用2007-11-02 10:35实验2 插值法与MATLAB应用一、实验名称:插值法与MATLAB应用。

二、实验目的:理解插值的基本原理,掌握常用算法的设计,掌握用MATLAB实现插值。

三、实验题目:已知数据如下:0.2 0.4 0.6 0.8 1.00.9798652 0.9177710 0.8080348 0.6386093 0.3843735四、实验要求:1、设计全区间上拉格朗日插值程序或者Newton插值程序。

利用MATLAB在第一个图中画出离散数据及插值函数曲线。

2、利用MATLAB画出分段线性插值函数,并与(1)作对比说明。

3、对于自然边界条件,利用MATLAB在第二个图中画出离散数据,再画出通过表中型值点并满足边界条件的三次样条插值函数。

4、对于第一种边界条件,利用MATLAB在第三个图中画出离散数据,再画出通过表中型值点并满足边界条件的三次样条插值函数。

5、例举一个闭区间上的连续函数,用画图或列表的方式观察与体会Runge现象,分别用下面方法对比说明:1)10次Lagrange;2)分段低次插值;3)分段三次样条插值。

6、通过这个实验,谈谈你对插值方法有何理解、三次样条插值有何特点?五、实验内容:1、设计全区间上拉格朗日插值程序或者Newton插值程序。

利用MATLAB在第一个图中画出离散数据及插值函数曲线。

编写拉格朗日插值多项式函数内容为:function f=lagfun(x)a=[0.2,0.4,0.6,0.8,1.0];b=[0.9798652,0.9177770,0.8080348,0.6386093,0.3843735];for i=1:5L(i)=1;for j=1:5if j~=iL(i)=L(i)*(x-a(j))/(a(i)-a(j));endendendf=0;for i=1:5f=f+L(i)*b(i);end画图程序内容为:fplot('lagfun',[0,1]);hold ona=[0.2,0.4,0.6,0.8,1.0];b=[0.9798652,0.9177770,0.8080348,0.6386093,0.3843735];plot(a, b,'o')图形为:2、利用MATLAB画出分段线性插值函数,并与(1)作对比说明。

Matlab实验报告六(三次样条与分段线性插值)

Matlab实验报告六(三次样条与分段线性插值)
数学与信息科学系实验报告
实验名称插值与拟合
所属课程数学软件与实验
实验类型综合型实验
专业信息与计算科学
班级
学号
姓名
指导教师
一、实验概述
【实验目的】
学会在matlab环境下使用几种不同的插值法和拟合两种方法构造函数依据已经知道的某些特殊点来推测实际问题中需要知道但又不便于测量出来的量。
【实验原理】
1.z=interp2(x0,y0,z0,x,y,’method’): 要求x0,y0单调;x, y可取为矩阵, 或x取行向量, y取为列向量, x,y的值分别不能超出x0,y0的范围。
2.分段线性插值与计算量与n无关;n越大, 误差越小.
3.三次样条插值比分段线性插值更光滑。
4.‘linear’ : 分段线性插值;‘spline’ : 三次样条
二、实验内容
问题1 对函数, x([-5,5], 分别用分段线性插值和三次样条插值作插值(其中插值节点不少于20), 并分别作出每种插值方法的误差曲线.
1180 1320 1450 1420 1400 1300 700 900];
mesh(x,y,z)
xi=0:20:2800;
yi=0:20:2400;
zi=interp2(x,y,z,xi',yi,'cubic');
mesh(xi,yi,zi)
3.结果
4.结论及分析
通过实验,结果正确,分析无误。
三、实验小结
1270 1500 1200 1100 1350 1450 1200 1150
1230 1390 1500 1500 1400 900 1100 1060
1180 1320 1450 1420 1400 1300 700 900

Matlab中插值函数汇总和使用说明

Matlab中插值函数汇总和使用说明

Matlab中插值函数汇总和使用说明以下内容的参考地址:/blog/article.asp?id=28904已知向量x,y,通过x,y求出向量xi的插值的值1、分段线性插值yi=interp1(x,y,xi)或yi=interp1(x,y,'linear')2、多项式插值多项式为y=p(1)*x+p(2)*x^2+...+p(n)*x^n,则可以用p=polyfit(x,y,n),(n是多项式的最高次数)求出系数向量p,然后用y=polyval(p,xi)求出向量xi的函数值y3、三次样条插值yi=interp1(x,y,xi,'spline')或yi=spline(x,y,xi)或pp=interp1(x,y,'spline','pp'),然后pp=spline(x,y)-->yi=ppval(pp,xi)4、分段三次埃尔米特yi=interp1(x,y,xi,'pchip')或yi=pchip(x,y,xi)或pp=interp1(x,y,'pchip','pp') pp=pchip(x,y)-->yi=pppval(pp.xi)以下内容的参考地址:/s/blog_6056e8800100k3xf.html命令1 interp1功能一维数据插值(表格查找)。

该命令对数据点之间计算内插值。

它找出一元函数f(x)在中间点的数值。

其中函数f(x)由所给数据决定。

x:原始数据点Y:原始数据点xi:插值点Yi:插值点格式(1)yi = interp1(x,Y,xi)返回插值向量yi,每一元素对应于参量xi,同时由向量x 与Y 的内插值决定。

参量x 指定数据Y 的点。

若Y 为一矩阵,则按Y 的每列计算。

yi 是阶数为length(xi)*size(Y,2)的输出矩阵。

(2)yi = interp1(Y,xi)假定x=1:N,其中N 为向量Y 的长度,或者为矩阵Y 的行数。

分形插值曲面的MATLAB程序

分形插值曲面的MATLAB程序

给定 一组 网格点上 的数 据 ( , ,= , , , m= 1 … , , , n 0 l… N; 0,, 肘。欲构 造 二元 分形 插值 函数 : )
足 : ‰, ) ≈ ,= , , , m O l … , n O l … N; = , , 肘。
, 且满
令 , 向的压缩 变换 为 方
维普资讯
苏 州科 技学 院 学报 ( 程技 术 版 ) 工
第 l 9卷 第 4期
J o ie st fS in e a d T c n lg fS z o . fUnv ri o ce c n e h oo yo u h u y
Vo.1 1 9 No 4 .
20 0 6年 l 2月
( n ie r ga dT c n lg ) E gn ei n e h oo y n
De . 2 o6 c 0
分形插值 曲面的 M T A A L B程序
孙 洪 泉
( 苏州 科 技 学 院 土 木 工 程 系 , 苏 苏 州 2 5 1) 江 10 1
1 分形插值 曲面 的数学模型
令 , ,】 [, 设 D IJ { ,)口 s6 C s , _ 6, c司; =x=( Y : x , 以 、 为步长 , D剖分为网格 △ 将
a x< l… 』6 = oy …< M d = oX < v ,c y< l y= : < () 1

( ∈{, , , , n 12 … 加 m∈{, , 肘1 l2 ‘ 一, )
() 5 ຫໍສະໝຸດ 式中 , . , 12 ., , {, .. ) l ,,. m∈ 12 ., 为决定分形插值 曲面分形维 数( ( ∈f .加 .M1 粗糙 程度 ) 自由参数 , 的 且满足
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一,分形插值算法——分形图的递归算法1,分形的定义分形(Fractal)一词,是法国人B.B.Mandelbrot 创造出来的,其原意包含了不规则、支离破碎等意思。

Mandelbrot 基于对不规则的几何对象长期地、系统地研究,于1973 年提出了分维数和分形几何的设想。

分形几何是一门以非规则几何形状为研究对象的几何学,用以描述自然界中普遍存在着的不规则对象。

分形几何有其显明的特征,一是自相似性;分形作为一个数学集合, 其内部具有精细结构, 即在所有比例尺度上其组成部分应包含整体, 而且彼此是相似的。

其定义有如下两种描述:定义 1如果一个集合在欧式空间中的 Hausdorff 维数H D 恒大于其拓扑维数r D ,则称该集合为分形集,简称分形。

定义 2组成部分以某种方式与整体相似的形体叫分形。

对于定义 1 的理解需要一定的数学基础,不仅要知道什么是Hausdorff 维数,而且要知道什么是拓扑维数,看起来很抽象,也不容易推广。

定义 2 比较笼统的说明了自然界中的物质只要局部和局部或者局部和整体之间存在自相似性,那么这个物质就是分形。

正是这一比较“模糊”的概念被人们普遍接受,同时也促进了分形的发展。

根据自相似性的程度,分形可分为有规分形和无规分形。

有规分形是指具有严格的自相似的分形,比如,三分康托集,Koch 曲线。

无规分形是指具有统计意义上的自相似性的分形,比如,曲折的海岸线,漂浮的云等。

本文主要研究有规分形。

2. 分形图的递归算法2.1 三分康托集1883 年,德国数学家康托(G.Cantor)提出了如今广为人知的三分康托集。

三分康托集是很容易构造的,然而,它却显示出许多最典型的分形特征。

它是从单位区间出发,再由这个区间不断地去掉部分子区间的过程构造出来的(如图2.1)。

其详细构造过程是:第一步,把闭区间[0,1]平均分为三段,去掉中间的 1/3 部分段,则只剩下两个闭区间[0,1/3]和[2/3,1]。

第二步,再将剩下的两个闭区间各自平均分为三段,同样去掉中间的区间段,这时剩下四段闭区间:[0,1/9],[2/9,1/3],[2/3,7/9]和[8/9,1]。

第三步,重复删除每个小区间中间的 1/3 段。

如此不断的分割下去,最后剩下的各个小区间段就构成了三分康托集。

三分康托集的 Hausdorff 维数是0.6309。

图2.2 三分康托集的构造过程2.2 Koch 曲线1904 年,瑞典数学家柯赫构造了“Koch 曲线”几何图形。

Koch 曲线大于一维,具有无限的长度,但是又小于二维,并且生成的图形的面积为零。

它和三分康托集一样,是一个典型的分形。

根据分形的次数不同,生成的Koch 曲线也有很多种,比如三次 Koch 曲线,四次 Koch 曲线等。

下面以三次 Koch 曲线为例,介绍 Koch 曲线的构造方法,其它的可依此类推。

三次Koch 曲线的构造过程主要分为三大步骤:第一步,给定一个初始图形一条线段;第二步,将这条线段中间的 1/3 处向外折起;第三步,按照第二步的方法不断的把各段线段中间的 1/3 处向外折起。

这样无限的进行下去,最后即可构造出Koch 曲线。

其图例构造过程如下图2.2所示(迭代了 6 次的图形)。

图 2.2 Koch曲线生成过程2.3 Sierpinski 垫片的递归算法在 Cantor 集与Koch 集的基础上继续讨论Sierpinski 垫片的生成算法,同样先建立模型如下图2.3,同时展示生成后的图形。

图2.3 Sierpinski 垫片模型其中先设定正三角形中心点坐标为(x, y),边长为L,迭代深度为n,三角形顶点分别为( xi,yi ),i= 1,2,3。

且下一层正三角形的中心坐标为(xi,yi),i=01,02,03。

2.4 分支结构分形递归算法研究如下图(图 2.4)的分支结构图的递归算法。

图 2.4分支结构分形图细分此分支结构,建立模型如下,其中取 A 为起点,且记 A 点坐标为(x,y),B 点坐标为(x1,x2),线段AB = L, 2 .3BC = BD = L 且设定 AB 与水平面的夹角为alpha, 递归深度为n。

3 基于MATLAB的各种递归算法实例3.1 三分康托集的MATLAB实例Cantor 三分集的递归算法设计为构造一个函数为Cantor(ax,ay,bx,by),其中(ax,ay)和(bx,by)分别代表初始位置端点的坐标。

取 err 为递归终止的极小量,取 h 为不同层次线段之间的距离,且设出(cx,cy)和(dx,dy)如图3.1图 3.1 建立Cantor 三分集模型(1),MATLAB程序Cantor(ax,ay,bx,by){ plot([ax,bx],[ay,by]); %画出每个层次上的图形if (bx-ax)>err%设定有限次递归{ cx = ax + ( bx – ax ) / 3;cy = ay – h;dx = bx – ( bx – ax ) / 3;dy = by – h;ay = ay – h;by = by – h;Cantor(ax,ay,cx,cy); %内部调用Cantor函数Cantor(dx,dy,bx,by); %内部调用Cantor函数}}(2) ,生成结果图形图 3.2 Cantor 三分集结果3.2 Koch 曲线的MATLAB实例在设计Koch曲线的递归算法时参考Cantor集的方法,先建立一个模型如下,图 3.3 Koch曲线模型(1),MATLAB程序Koch(ax,ay,bx,by){ err=1; %递归终极小量line([ax bx],[ay by]);hold on;%画出图形if ((bx-ax)^2+(by-ay)^2)>err%递归终止条件{ cx=ax+(bx-ax)/3;cy=ay+(by-ay)/3;ex=bx-(bx-ax)/3;ey=by-(by-ay)/3;L=sqrt((ex-cx)^2+(ey-cy)^2);%计算 Lalpha=atan((ey-cy)/(ex-cx)); %计算aif((ex-cx)<0){alpha=alpha+pi; %图形旋转}dy=cy+sin(alpha+pi/3)*L;dx=cx+cos(alpha+pi/3)*L;Koch(ax,ay,cx,cy); %递归调用Koch(ex,ey,bx,by);Koch(cx,cy,dx,dy);Koch(dx,dy,ex,ey);(2),生成结果图形图 3.4 Koch曲线生成结果3.3 Sierpinski 垫片的MATLAB实例(1),MATLAB程序Sierpinski(x, y, L, n){if (n==1)x1=x-L/2;y1=y-L/2*tan(pi/6);x2=x+L/2;y2=y-L/2*tan(pi/6);x3=x;y3=y+L/2*tan(pi/6);line([x1 x2],[y1 y2],'Color','r','LineWidth',2); hold on;line([x2 x3],[y2 y3],'Color','g','LineWidth',2); hold on;line([x3 x1],[y3 y1],'Color','y','LineWidth',2); hold on;elsex01=x-L/4;y01=y-L/4*tan(pi/6);x02=x+L/4;y02=y-L/4*tan(pi/6);x03=x;y03=y+L/2*tan(pi/6);Sierpinski(x01,y01,L/2,n-1); %递归调用Sierpinski(x02,y02,L/2,n-1);Sierpinski(x03,y03,L/2,n-1);end}(2),生成结果图形图 3.5 n=6时Sierpinski垫片生成图图3.6 n=10 时Sierpinski 垫片生成图3.4 分支结构分形的MATLAB实例(1),MATLAB程序Ramus(x, y,alpha, L, n)if n>0x1=x+cos(alpha)*L;y1=y+sin(alpha)*L;line([x,x1],[y,y1],'Color','g','LineWidth',2);alpha_L=alpha+pi/8;alpha_R=alpha-pi/8;L=2*L/3;Ramus(x1,y1,alpha_L,L,n-1); %递归调用Ramus(x1,y1,alpha_R,L,n-1);End(2),生成结果图形图 3.7α=π/4时分支结构生成图图 3.7α=π/3时分支结构生成图二, MATLAB实验1.图像的二值化程序如下:I=imread('C:\Users\Administrator.SD-20111228XIYE\Desktop\001.j pg');I1=rgb2gray(I);level=graythresh(I1);I2=im2bw(I1,level);I3=~I2;I4=bwareaopen(I3,50);I5=~I4;figure,imshow(I5)原图:二值化后的图像:2.三种插值算法程序:I=imread('C:\Users\Administrator.SD-20111228XIYE\Desktop\001.jp g ');figure, imshow(I);A=imresize(I,2,'nearest'); %最邻近插值figure, imshow(A);B=imresize(I,2,'bilinear');%双线性插值figure, imshow(B);C=imresize(I,2,'bicubic'); %三次插值figure, imshow(C);(1)最邻近插值(2)双线性插值(3)立方卷积插值3.抠图实验MATLAB程序:Mainclose allclear allclcimg_name = input('请输入图像名字(图像必须为RGB图像,输入0结束):','s'); % 当输入0时结束while ~strcmp(img_name,'0')%进行人脸识别facedetection(img_name);img_name = input('请输入图像名(图像必须为RGB图像,输入0结束):','s'); end子程序1 RGBfunction rgbPic = bw2rgb(bwPic)bwPicSize = size(bwPic);rgbPic = zeros(bwPicSize(1),bwPicSize(2),3); rgbPic(bwPic==255)=255;rgbPic(:,:,2) = rgbPic(:,:,1); % nice jobrgbPic(:,:,3) = rgbPic(:,:,1);rgbPic = im2uint8(rgbPic);子程序2 人脸识别function facedetection(img_name)I = imread(img_name);I2 = imread('dog.png');doge = imresize(I2,[size(I,1) size(I,2)]);gray = rgb2gray(I);YCbCr = rgb2ycbcr(I);heigth = size(gray,1);width = size(gray,2);for i = 1:heigthfor j = 1:widthY = YCbCr(i,j,1);Cb = YCbCr(i,j,2);Cr = YCbCr(i,j,3);if(Y < 80)gray(i,j) = 0;elseif(skin(Y,Cb,Cr) == 1)gray(i,j) = 255;elsegray(i,j) = 0;endendendendSE=strel('arbitrary',eye(5));gray = imopen(gray,SE);gray = imclose(gray,SE);a1=(255-bw2rgb(gray))/255;next1=immultiply(I,a1);a2=bw2rgb(gray)/255;next2=immultiply(doge,a2);add=imadd(next1,next2);[L,num] = bwlabel(gray,8);STATS = regionprops(L,'BoundingBox');n = 1;result = zeros(n,4);figure,subplot(1,2,1),imshow(I),subplot(1,2,2),imshow(doge);figure,subplot(1,2,1),imshow(next1),subplot(1,2,2),imshow(next2);figure,imshow(add);hold on;for i = 1:numbox = STATS(i).BoundingBox;x = box(1);y = box(2);w = box(3);h = box(4);ratio = h/w;ux = uint8(x);uy = uint8(y);if ux > 1ux = ux - 1;endif uy > 1uy = uy - 1;endif w < 20 || h < 20 || w*h < 400continueelseif ratio < 2.0 && ratio > 0.6 && findeye(gray,ux,uy,w,h) == 1result(n,:) = [ux uy w h];n = n+1;endendif size(result,1) == 1 && result(1,1) > 0rectangle('Position',[result(1,1),result(1,2),result(1,3),result(1,4)],'EdgeColor','r');for m = 1:size(result,1)m1 = result(m,1);m2 = result(m,2);m3 = result(m,3);m4 = result(m,4);if m1 + m3 < width && m2 + m4 < heigthrectangle('Position',[m1,m2,m3,m4],'EdgeColor','r');endendend子程序3 find eyefunction eye = findeye(bImage,x,y,w,h)part = zeros(h,w);for i = y:(y+h)for j = x:(x+w)if bImage(i,j) == 0part(i-y+1,j-x+1) = 255;elsepart(i-y+1,j-x+1) = 0;endendend[L,num] = bwlabel(part,8);if num < 2eye = 0;elseeye = 1;end子程序4 skinfunction result = skin(Y,Cb,Cr)a = 25.39;b = 14.03;ecx = 1.60;ecy = 2.41;sita = 2.53;cx = 109.38;cy = 152.02;xishu = [cos(sita) sin(sita);-sin(sita) cos(sita)];if(Y > 230)a = 1.1*a;b = 1.1*b;endCb = double(Cb);Cr = double(Cr);t = [(Cb-cx);(Cr-cy)];temp = xishu*t;value = (temp(1) - ecx)^2/a^2 + (temp(2) - ecy)^2/b^2; if value > 1result = 0;elseresult = 1;end处理前的图像:处理后的图像:。

相关文档
最新文档