分形插值算法和MATLAB实验分析.docx
- 文档编号:29773880
- 上传时间:2023-07-26
- 格式:DOCX
- 页数:24
- 大小:2.03MB
分形插值算法和MATLAB实验分析.docx
《分形插值算法和MATLAB实验分析.docx》由会员分享,可在线阅读,更多相关《分形插值算法和MATLAB实验分析.docx(24页珍藏版)》请在冰豆网上搜索。
分形插值算法和MATLAB实验分析
一,分形插值算法
——分形图的递归算法
1,分形的定义
分形(Fractal)一词,是法国人B.B.Mandelbrot创造出来的,其原意包含了不规则、支离破碎等意思。
Mandelbrot基于对不规则的几何对象长期地、系统地研究,于1973年提出了分维数和分形几何的设想。
分形几何是一门以非规则几何形状为研究对象的几何学,用以描述自然界中普遍存在着的不规则对象。
分形几何有其显明的特征,一是自相似性;分形作为一个数学集合,其内部具有精细结构,即在所有比例尺度上其组成部分应包含整体,而且彼此是相似的。
其定义有如下两种描述:
定义1如果一个集合在欧式空间中的Hausdorff维数HD恒大于其拓扑维数
rD,则称该集合为分形集,简称分形。
定义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.2Koch曲线
1904年,瑞典数学家柯赫构造了“Koch曲线”几何图形。
Koch曲线大于一维,具有无限的长度,但是又小于二维,并且生成的图形的面积为零。
它和三分康托集一样,是一个典型的分形。
根据分形的次数不同,生成的Koch曲线也有很多种,比如三次Koch曲线,四次Koch曲线等。
下面以三次Koch曲线为例,介绍Koch曲线的构造方法,其它的可依此类推。
三次Koch曲线的构造过程主要分为三大步骤:
第一步,给定一个初始图形一条线段;第二步,将这条线段中间的1/3处向外折起;第三步,按照第二步的方法不断的把各段线段中间的1/3处向外折起。
这样无限的进行下去,最后即可构造出Koch曲线。
其图例构造过程如下图2.2所示(迭代了6次的图形)。
图2.2Koch曲线生成过程
2.3Sierpinski垫片的递归算法
在Cantor集与Koch集的基础上继续讨论Sierpinski垫片的生成算法,同样先建立模型如下图2.3,同时展示生成后的图形。
图2.3Sierpinski垫片模型
其中先设定正三角形中心点坐标为(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.2Cantor三分集结果
3.2Koch曲线的MATLAB实例
在设计Koch曲线的递归算法时参考Cantor集的方法,先建立一个模型如下,
图3.3Koch曲线模型
(1),MATLAB程序
Koch(ax,ay,bx,by)
{err=1;%递归终极小量
line([axbx],[ayby]);holdon;%画出图形
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);%计算L
alpha=atan((ey-cy)/(ex-cx));%计算a
if((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.4Koch曲线生成结果
3.3Sierpinski垫片的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([x1x2],[y1y2],'Color','r','LineWidth',2);
holdon;
line([x2x3],[y2y3],'Color','g','LineWidth',2);
holdon;
line([x3x1],[y3y1],'Color','y','LineWidth',2);
holdon;
else
x01=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.5n=6时Sierpinski垫片生成图
图3.6n=10时Sierpinski垫片生成图
3.4分支结构分形的MATLAB实例
(1),MATLAB程序
Ramus(x,y,alpha,L,n)
ifn>0
x1=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.jpg');
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.jpg');
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程序:
Main
closeall
clearall
clc
img_name=input('请输入图像名字(图像必须为RGB图像,输入0结束):
','s');
%当输入0时结束
while~strcmp(img_name,'0')
%进行人脸识别
facedetection(img_name);
img_name=input('请输入图像名(图像必须为RGB图像,输入0结束):
','s');
end
子程序1RGB
functionrgbPic=bw2rgb(bwPic)
bwPicSize=size(bwPic);
rgbPic=zeros(bwPicSize
(1),bwPicSize
(2),3);
rgbPic(bwPic==255)=255;
rgbPic(:
:
2)=rgbPic(:
:
1);%nicejob
rgbPic(:
:
3)=rgbPic(:
:
1);
rgbPic=im2uint8(rgbPic);
子程序2人脸识别
functionfacedetection(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);
fori=1:
heigth
forj=1:
width
Y=YCbCr(i,j,1);
Cb=YCbCr(i,j,2);
Cr=YCbCr(i,j,3);
if(Y<80)
gray(i,j)=0;
else
if(skin(Y,Cb,Cr)==1)
gray(i,j)=255;
else
gray(i,j)=0;
end
end
end
end
SE=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);
holdon;
fori=1:
num
box=STATS(i).BoundingBox;
x=box
(1);
y=box
(2);
w=box(3);
h=box(4);
ratio=h/w;
ux=uint8(x);
uy=uint8(y);
ifux>1
ux=ux-1;
end
ifuy>1
uy=uy-1;
end
ifw<20||h<20||w*h<400
continue
elseifratio<2.0&&ratio>0.6&&findeye(gray,ux,uy,w,h)==1
result(n,:
)=[uxuywh];
n=n+1;
end
end
ifsize(result,1)==1&&result(1,1)>0
rectangle('Position',[result(1,1),result(1,2),result(1,3),result(1,4)],'EdgeColor','r');
else
form=1:
size(result,1)
m1=result(m,1);
m2=result(m,2);
m3=result(m,3);
m4=result(m,4);
ifm1+m3 rectangle('Position',[m1,m2,m3,m4],'EdgeColor','r'); end end end 子程序3findeye functioneye=findeye(bImage,x,y,w,h) part=zeros(h,w); fori=y: (y+h) forj=x: (x+w) ifbImage(i,j)==0 part(i-y+1,j-x+1)=255; else part(i-y+1,j-x+1)=0; end end end [L,num]=bwlabel(part,8); ifnum<2 eye=0; else eye=1; end 子程序4skin functionresult=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; end Cb=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; ifvalue>1 result=0; else result=1; end 处理前的图像: 处理后的图像:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 分形插值 算法 MATLAB 实验 分析
![提示](https://static.bdocx.com/images/bang_tan.gif)