当前位置:首页 » 操作系统 » 算法设计与分析实验报告

算法设计与分析实验报告

发布时间: 2022-09-26 06:41:13

① 计算机程序设计基础的实验报告怎么写

1
实验要求
:
1.
实验前按实验报告格式要求,写出预实验报告,注意留出记录结果的空间。

2.
认真实验
,
注意记录

3.
撰写实验报告
.
按时上交
.

实验报告格式:

实验
*

***** ***** *****
一、

实验目的

照抄实验指导的内容。

二、

实验步骤和内容

包括:

1
.实验题目要求。

2
.源程序清单

3
.预期结果

3
.上机执行或调试结果:包括原始数据、相应的运行结果和必要的说明

三、

实验体会

调试中遇到的问题及解决办法;若最终未完成调试,要试着分析原因;调试程
序的心得与体会;其他算法的存在与实践;对课程及实验的建议等。

② 实验报告怎么写啊

实验名称

要用最简练的语言反映实验的内容。如验证某程序、定律、算法,可写成“验证×××”;分析×××。

学生姓名、学号、及合作者

实验日期和地点(年、月、日)

实验目的

目的要明确,在理论上验证定理、公式、算法,并使实验者获得深刻和系统的理解,在实践上,掌握使用实验设备的技能技巧和程序的调试方法。一般需说明是验证型实验还是设计型实验,是创新型实验还是综合型实验。[2]

实验设备(环境)及要求

在实验中需要用到的实验用物,药品以及对环境的要求。

实验原理

在此阐述实验相关的主要原理。

实验内容

这是实验报告极其重要的内容。要抓住重点,可以从理论和实践两个方面考虑。这部分要写明依据何种原理、定律算法、或操作方法进行实验。详细理论计算过程。

实验步骤

只写主要操作步骤,不要照抄实习指导,要简明扼要。还应该画出实验流程图(实验装置的结构示意图),再配以相应的文字说明,这样既可以节省许多文字说明,又能使实验报告简明扼要,清楚明白。

具体的范文模板
链接:链接: https://pan..com/s/1cXhjjCVFxjqu_hYLWaTnRg

?pwd=xjak 提取码: xjak

c语言程序设计题。实验报告。高分。

车票系统,与你的第2题要求略有不同,你自己修改吧
#include<stdio.h>
#include<stdlib.h>
#include<dos.h>
#include<time.h>
#include<conio.h>
#include<string.h>
const int MAX=20;
const int N=50;
const int MAXFILENAME=100;
enum {FALSE,TRUE};
struct time
{
int hour;
int minutes;
};
struct ticket
{
int SerialNumber;
struct time SetOut;
char DeparturePoint[MAX];
char TerminalPoint[MAX];
float LastTime;
int FixNumber;
int FixedNumber;
}car[N];
int RecordNumber;
int FLAG=FALSE;
/**********************************************/
int ShowMessage(void); //载入原始数据
void mainmenu(void); //主菜单
void InsertMessage(void); //录入班次信息
void SearchMenu(void); //查询路线子菜单
void SearchByNumber(void); //按班次号查询
void SearchByAddress(void); //按终点站查询
void TicketManagement(void); //车票售出与退回
void TicketOrder(void); //售票
void TicketDelete(void); //退票
void exit(void); //退出该系统
/********************************************/
int main(void)
{
RecordNumber=ShowMessage();
if(1)
do{
mainmenu();
}while(FLAG==FALSE);
return 0;
}
void mainmenu(void)
{
system("color 1f");
system("mode con: cols=140 lines=130");
char functionNumber;
printf(" 车票管理系统\n\n");
printf(" 制作:hmm182007\n");
printf(" 日期:2007/11/25/19:57\n");
printf("============================================================================\n");
printf(" 1.录入班次信息\t\n");
printf(" 2.浏览班次信息\t\n");
printf(" 3.查询行车路线\t\n");
printf(" 4.售票与退票系统\t\n");
printf(" 5.退出该系统\t\n");
printf("============================================================================\n");
printf("请选择你所需要的功能:");
scanf("%c",&functionNumber);
switch(functionNumber)
{
case '1':
{
InsertMessage();
printf("\n按任意键回主菜单......\n");
getchar();
getchar();
}
break;
case '2':
{
ShowMessage();
printf("\n按任意键回主菜单......\n");
getchar();
getchar();
}
break;
case '3':
{
SearchMenu();
printf("\n按任意键回主菜单......\n");
getchar();
getchar();
}
break;
case '4':
{
TicketManagement();
getchar();
getchar();
}
break;
case '5':FLAG=TRUE;exit();break;
default:
{
printf("输入错误,请确保你的输入为1--5.\n");
printf("按任意键回主菜单......\n");
getchar();
getchar();
}
}//switch ends
FLAG=FALSE;
}
void InsertMessage(void)
{
FILE *fp;
char filename[MAXFILENAME];
int i;
printf("请输入文件名或者文件路径名:");
scanf("%s",filename);
if((fp=fopen(filename,"r"))==NULL)
{
printf("文件%s不可读,请确认文件%s存在或者文件路径正确.\n\n",filename,filename);
mainmenu();
}
for(i=RecordNumber;!feof(fp)&&!ferror(fp);i++)
{
fscanf(fp,"%d%d%d",&car[i].SerialNumber,&car[i].SetOut.hour,&car[i].SetOut.minutes);
fscanf(fp,"%s%s%f%d%d",&car[i].DeparturePoint,&car[i].TerminalPoint,&car[i].LastTime,&car[i].FixNumber,&car[i].FixedNumber);
}
int count=i;
printf("班次\t发车时间\t起点\t终点\t行车时间(小时)\t额定载量\t已定票人数\n");
for(i=0;i<count;i++)
{
printf("%d\t%d:%d\t\t",car[i].SerialNumber,car[i].SetOut.hour,car[i].SetOut.minutes);
printf("%s\t%s\t\t%.1f\t %d\t\t%d\n",car[i].DeparturePoint,car[i].TerminalPoint,car[i].LastTime,car[i].FixNumber,car[i].FixedNumber);
}
fclose(fp);
}
int ShowMessage(void)
{
int i;
FILE *fp;
if((fp=fopen("add.txt","r"))==NULL)
{
printf("读取数据失败,请检查文件add.txt是否存在.\n");
exit(-1);
}
for(i=0;!feof(fp)&&!ferror(fp);i++)
{
fscanf(fp,"%d%d%d",&car[i].SerialNumber,&car[i].SetOut.hour,&car[i].SetOut.minutes);
fscanf(fp,"%s%s%f%d%d",&car[i].DeparturePoint,&car[i].TerminalPoint,&car[i].LastTime,&car[i].FixNumber,&car[i].FixedNumber);
}
int count=i;
printf("班次\t发车时间\t起点\t终点\t行车时间(小时)\t额定载量\t已定票人数\n");
for(i=0;i<count;i++)
{
printf("%d\t%d:%d\t\t",car[i].SerialNumber,car[i].SetOut.hour,car[i].SetOut.minutes);
printf("%s\t%s\t\t%.1f\t %d\t\t%d\n",car[i].DeparturePoint,car[i].TerminalPoint,car[i].LastTime,car[i].FixNumber,car[i].FixedNumber);
}
return count;
}
void SearchMenu(void)
{
system("color 1f");
system("mode con: cols=140 lines=130");
char functionNumber;
printf(" 查询子菜单\n");
printf("============================================================================\n");
printf(" 1.按班次号查询\t\n");
printf(" 2.按终点站查询\t\n");
printf(" 3.返回主菜单\t\n");
printf("============================================================================\n");
printf("请选择你所需要的功能:");
scanf("%*c%c",&functionNumber);
switch(functionNumber)
{
case '1':SearchByNumber();break;
case '2':SearchByAddress();break;
case '3':
getchar();
mainmenu();
break;
default:
printf("输入错误,请确保你的输入为1--3.\n");
printf("按任意键回查询子菜单......\n");
getchar();
getchar();
SearchMenu();
}
}
void SearchByNumber(void)
{
int SearchNumber;
printf("请输入要查询的班次号:");
scanf("%d",&SearchNumber);
printf("班次\t发车时间\t起点\t终点\t行车时间(小时)\t额定载量\t已定票人数\n");
printf("%d\t%d:%d\t\t",car[SearchNumber-1].SerialNumber,car[SearchNumber-1].SetOut.hour,car[SearchNumber-1].SetOut.minutes);
printf("%s\t%s\t\t%.1f\t %d\t\t%d\n",car[SearchNumber-1].DeparturePoint,car[SearchNumber-1].TerminalPoint,car[SearchNumber-1].LastTime,car[SearchNumber-1].FixNumber,car[SearchNumber-1].FixedNumber);
}
void SearchByAddress(void)
{
int i;
char Address[MAX];
printf("请输入终点站的名称:");
scanf("%s",&Address);
printf("班次\t发车时间\t起点\t终点\t行车时间(小时)\t额定载量\t已定票人数\n");
for(i=0;i<RecordNumber;i++)
{
//对比终点站记录,找到并输出
if((strcmp(Address,car[i].TerminalPoint))==0)
{
printf("%d\t%d:%d\t\t",car[i].SerialNumber,car[i].SetOut.hour,car[i].SetOut.minutes);
printf("%s\t%s\t\t%.1f\t %d\t\t%d\n",car[i].DeparturePoint,car[i].TerminalPoint,car[i].LastTime,car[i].FixNumber,car[i].FixedNumber);
}
}
}
void TicketManagement(void)
{
char functionNumber;
system("color 1f");
system("mode con: cols=140 lines=130");
printf(" 订票与退票菜单\n");
printf("============================================================================\n");
printf(" 1.订票\t\n");
printf(" 2.退票\t\n");
printf(" 3.返回主菜单.\n");
printf("============================================================================\n");
printf("选择你需要的功能:");
scanf("%*c%c",&functionNumber);

switch(functionNumber)
{
case '1':
{
TicketOrder();
//getchar();
//getchar();
}
break;
case '2':TicketDelete();break;
case '3':
{
getchar();
mainmenu();
}
break;
default:
{
printf("输入错误,请确保你的输入为1--3.\n");
printf("按任意键回主菜单......\n");
getchar();
getchar();
mainmenu();
}
}
}
void TicketOrder(void)
{
int i;
printf("请输入要订购的车票的班次:");
scanf("%d",&i);
if(i<0||i>RecordNumber)
{
printf("对不起,今天没有这趟车,请明天再来,谢谢使用!\n");
printf("按任意键回主菜单......\n");
getchar();//getchar();
TicketManagement();
}

time_t tval;
struct tm *now;
tval = time(NULL);
now = localtime(&tval);
if((now->tm_hour==car[i].SetOut.hour&&now->tm_min<car[i].SetOut.minutes)||(now->tm_hour<car[i].SetOut.hour))
{
if(car[i].FixedNumber<car[i].FixNumber)
{
car[i].FixedNumber++;
printf("你的订票成功,请按时上车,谢谢使用!\n");
}
else printf("对不起,今天的这趟车的票已卖完,请明天再来,谢谢合作!\n");
}
else printf("对不起,今天的这趟车已发出,请明天再来,谢谢合作!\n");

printf("班次\t发车时间\t起点\t终点\t行车时间(小时)\t额定载量\t已定票人数\n");
printf("%d\t%d:%d\t\t",car[i-1].SerialNumber,car[i-1].SetOut.hour,car[i-1].SetOut.minutes);
printf("%s\t%s\t\t%.1f\t %d\t\t%d\n",car[i-1].DeparturePoint,car[i-1].TerminalPoint,car[i-1].LastTime,car[i-1].FixNumber,car[i-1].FixedNumber);
//printf("按任意键回主菜单......\n");
//getchar();getchar();
}
void TicketDelete(void)
{
int i;
printf("请输入要退购的车票的班次:");
scanf("%d",&i);
if(i<0||i>RecordNumber)
{
printf("对不起,今天没有这趟车,无法完成退票.谢谢使用!\n");
getchar();
//getchar();
TicketManagement();
getchar();
}
time_t tval;
struct tm *now;
tval = time(NULL);
now = localtime(&tval);
if((now->tm_hour==car[i].SetOut.hour&&now->tm_min<car[i].SetOut.minutes)||(now->tm_hour<car[i].SetOut.hour))
{
if(car[i].FixedNumber>=1)
{
car[i].FixedNumber--;
printf("退订车票成功,谢谢使用!\n");
}
else printf("对不起,今天的这趟车的票尚未卖出,无法完成退票!\n");
}
else printf("对不起,今天的这趟车已发出,无法完成退票!\n");

printf("班次\t发车时间\t起点\t终点\t行车时间(小时)\t额定载量\t已定票人数\n");
printf("%d\t%d:%d\t\t",car[i-1].SerialNumber,car[i-1].SetOut.hour,car[i-1].SetOut.minutes);
printf("%s\t%s\t\t%.1f\t %d\t\t%d\n",car[i-1].DeparturePoint,car[i-1].TerminalPoint,car[i-1].LastTime,car[i-1].FixNumber,car[i-1].FixedNumber);
getchar();//getchar();
}
void exit(void)
{
printf("\n\n*********************谢谢使用本系统,欢迎下次继续使用***********************\n");
exit(0);
}

④ 求一篇数值分析实验报告

数值分析实验报告

姓名: 学号:

实验1:

1. 实验项目的性质和任务

通过上机实验,对病态问题、线性方程组求解和函数的数值逼近方法有一个初步理解。

2.教学内容和要求

1)对高阶多多项式

编程求下面方程的解

并绘图演示方程的解与扰动量 的关系。(实验2.6)

2)对 ,生成对应的Hilbert矩阵,计算矩阵的条件数;通过先确定解获得常向量b的方法,确定方程组

最后,用矩阵分解方法求解方程组,并分析计算结果。(第三章,实验题4)

3)对函数

的Chebyshev点

编程进行Lagrange插值,并分析插值结果。(第四章 实验1)

项目涉及核心知识点

病态方程求解、矩阵分解和方程组求解、Lagrange插值。

重点与难点

算法设计和matlab编程。

1)a.实验方案:

先创建一个20*50的零矩阵X,然后利用Matlab中的roots()和poly()函数将50个不同的ess扰动值所产生的50个解向量分别存入X矩阵中。然后再将ess向量分别和X的20个行向量绘图。即可直观的看出充分小的扰动值会产生非常大的偏差。即证明了这个问题的病态性。

b.编写程序:

>> X=zeros(20,50);

>> ve=zeros(1,21);

>> ess=linspace(0,0.00001,50);k=1;

>> while k<=50

ve(2)=ess(k);

X(1:20,k)=roots(poly(1:20)+ve);

k=k+1;

end

>> m=1;

>> while m<=20

figure(m),plot(ess,X(m,:));

m=m+1;

end

C.实验结果分析和拓展

由上面的实验结果可以看出一个充分小的扰动值可以让方程的解产生非常大的偏差,而且这个偏差随着ess的变大偏差也随即变大。但可以看出在相对小的根处根比较稳定,也就是说这些根关于ess并不敏感,而在较大根处时,根很不稳定,即这些解关于ess的变化是敏感的。这就说明了这个问题本身就是一个病态问题,与算法好坏无关。

若扰动在x^18处,只要把程序中的ve(2)改为ve(3)即可,其图形和此类似。

d.实验结论:

高次多项式扰动求方程解问题是一个病态问题。

2)a.实验方案:

先创建一个20*20的零矩阵A,再通过给定解x和Hilbert矩阵求出列向量b,然后通过LU分解法求出方程HX=b的解X,然后将x-X’这一行向量存入A矩阵中,形成一循环,最后,如果Hilbert矩阵非病态的话,则可输出一个20*20的对角矩阵。

b.编写程序:

>> n=2;

>> A=zeros(20,20);

>> while n<=20

x=1:n;

H=hilb(n);

b=H*x';

[L U]=lu(H);

y=L\b;X=U\y;

A(n,1:n)=x-X';

n=n+1;

end

Warning: Matrix is close to singular or badly scaled.

Results may be inaccurate. RCOND = 4.455948e-017.

Warning: Matrix is close to singular or badly scaled.

Results may be inaccurate. RCOND = 7.948463e-017.

Warning: Matrix is close to singular or badly scaled.

Results may be inaccurate. RCOND = 1.798429e-016.

Warning: Matrix is close to singular or badly scaled.

Results may be inaccurate. RCOND = 7.626119e-018.

Warning: Matrix is close to singular or badly scaled.

Results may be inaccurate. RCOND = 6.040620e-017.

Warning: Matrix is close to singular or badly scaled.

Results may be inaccurate. RCOND = 5.444860e-017.

>> A

A =

1.0e+003 *

Columns 1 through 10

0 0 0 0 0 0 0 0 0 0

-0.0000 0.0000 0 0 0 0 0 0 0 0

-0.0000 0.0000 -0.0000 0 0 0 0 0 0 0

-0.0000 0.0000 -0.0000 0.0000 0 0 0 0 0 0

0.0000 -0.0000 0.0000 -0.0000 0.0000 0 0 0 0 0

0.0000 -0.0000 0.0000 -0.0000 0.0000 -0.0000 0 0 0 0

0.0000 -0.0000 0.0000 -0.0000 0.0000 -0.0000 0.0000 0 0 0

-0.0000 0.0000 -0.0000 0.0000 -0.0000 0.0000 -0.0000 0.0000 0 0

-0.0000 0.0000 -0.0000 0.0000 -0.0000 0.0000 -0.0000 0.0000 -0.0000 0

-0.0000 0.0000 -0.0000 0.0000 -0.0000 0.0000 -0.0000 0.0000 -0.0000 0.0000

-0.0000 0.0000 -0.0000 0.0000 -0.0000 0.0000 -0.0000 0.0000 -0.0000 0.0000

-0.0000 0.0000 -0.0000 0.0000 -0.0000 0.0001 -0.0003 0.0006 -0.0007 0.0005

0.0000 -0.0000 0.0000 -0.0001 0.0005 -0.0027 0.0096 -0.0223 0.0348 -0.0361

0.0000 -0.0000 0.0000 -0.0004 0.0030 -0.0098 0.0080 0.0593 -0.2570 0.5154

0.0000 -0.0000 0.0000 -0.0001 0.0005 -0.0029 0.0095 -0.0171 0.0086 0.0347

0.0000 -0.0000 0.0000 -0.0000 0.0003 -0.0016 0.0059 -0.0133 0.0145 0.0094

0.0000 -0.0000 0.0000 -0.0001 0.0009 -0.0042 0.0118 -0.0182 0.0082 0.0185

0.0000 0.0000 -0.0000 0.0002 -0.0027 0.0187 -0.0762 0.1806 -0.2249 0.0813

0.0000 0.0000 -0.0000 0.0001 -0.0017 0.0120 -0.0497 0.1224 -0.1699 0.1064

0.0000 -0.0000 0.0000 -0.0003 0.0028 -0.0137 0.0371 -0.0464 -0.0164 0.1243

Columns 11 through 20

0 0 0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0

-0.0000 0 0 0 0 0 0 0 0 0

-0.0002 0.0000 0 0 0 0 0 0 0 0

0.0238 -0.0091 0.0015 0 0 0 0 0 0 0

-0.6091 0.4336 -0.1727 0.0296 0 0 0 0 0 0

-0.0944 0.1170 -0.0824 0.0318 -0.0053 0 0 0 0 0

-0.0624 0.1107 -0.1110 0.0674 -0.0232 0.0035 0 0 0 0

-0.0289 0.0059 0.0103 0.0082 -0.0263 0.0181 -0.0042 0 0 0

0.0524 0.1690 -0.3743 -0.1862 1.0944 -1.2171 0.6004 -0.1156 0 0

-0.0327 0.1652 -0.3051 -0.0485 0.7195 -0.9387 0.5714 -0.1699 0.0191 0

-0.1120 -0.0421 0.0883 0.0222 -0.0628 0.1013 -0.2902 0.3783 -0.2173 0.0469

C.实验结果分析和拓展:

当Hilbert矩阵的阶数比较小时,其解X和给定解x偏差不大;但当Hilbert矩阵的阶数变大时,偏差就会变大。这就说明了Hilbert矩阵是一组病态矩阵,从Matlab运行中的Warning可以看出,其条件数相当大。

d.实验结论:

Hilbert矩阵是一组病态矩阵,用它来做线性方程的系数矩阵时,往往会得出与精确解相差较大的解。

3)a.实验方案:

在区间【-1,1】上取点,先按Chebyshev取点,即xk=cos((2k-1)pi/2/(n+1))取点,然后再进行拉格朗日插值,绘出图和插值点。而后再进行均匀取点再拉格朗日插值。将两种插值结果进行比较。

b.编程实现:

for a=1:10

b=a+1;

for c=1:b

X(c)=cos((2*c-1)*pi/2/(a+1));

Y(c)=1/(1+25*X(c)^2);

x=-1:0.05:1;

end

m=length(x);

for i=1:m

z=x(i);s=0;

for k=1:b

L=1;

for j=1:b

if j~=k

L=L*(z-X(j))/(X(k)-X(j));

end

end

s=s+L*Y(k);

end

y(i)=s;

end

figure(1)

plot(x,y,'r');

hold on;

figure(2)

plot(X,Y,'b*')

hold on

end

for a=2:2:10

b=a+1;

X=linspace(-1,1,b);

Y=1./(1+25*X.^2);

x=-1:0.05:1;

m=length(x);

for i=1:m

z=x(i);s=0;

for k=1:b

L=1;

for j=1:b

if j~=k

L=L*(z-X(j))/(X(k)-X(j));

end

end

s=s+L*Y(k);

end

y(i)=s;

end

figure(1)

plot(x,y,'r');

hold on;

figure(2)

plot(X,Y,'b*')

hold on

end

C.实验结果分析及拓展:

均匀插值时,当n比较大时,就会出现多项式插值的Runge现象,即当插值节点的个数n增加时,Lagrange插值多项式对原来函数的近似并非越来越好。当进行非等距节点插值时,其近似效果明显要比均匀插值是要好。原因是非均匀插值时,在远离原点处的插值节点比较密集,所以其插值近似效果要比均匀插值时的效果要好。

d.实验结论:

利用Chebyshev点进行非等距节点插值的对原函数的近似效果要比均匀节点插值的好。

⑤ 计算机算法设计与分析的内容简介

《计算机算法设计与分析(第3版)》为普通高等教育“十一五”国家级规划教材,是计算机专业核心课程“算法设计与分析”教材。全书以算法设计策略为知识单元,系统介绍计算机算法的设计方法与分析技巧。主要内容包括:算法概述、递归与分治策略、动态规划、贪心算法、回溯法、分支限界法、随机化算法、线性规划与网络流、NP完全性理论与近似算法等。书中既涉及经典与实用算法及实例分析,又包括算法热点领域追踪。
为突出教材的可读性和可用性,章首增加了学习要点提示;章末配有难易适度的习题,分为算法分析题和算法实现题两部分;配套出版了《算法设计与实验题解》;并免费提供电子课件和教学网站服务。

⑥ 图像边缘检测算法的研究与实现 的开题报告

摘 要 针对基于PC实现的图像边缘检测普遍存在的执行速度慢、不能满足实时应用需求等缺点,本文借助于TI公司的TMS320DM642图像处理芯片作为数字图像处理硬件平台,DSP/BIOS为实时操作系统,利用CCS开发环境来构建应用程序;并通过摄像头提取视频序列,实现对边缘检测Sobel算子改进[1]。
关键词 DM642;Sobel算子;程序优化;图像边缘检测

1 引言
边缘是图像中重要的特征之一,是计算机视觉、模式识别等研究领域的重要基础。图像的大部分主要信息都存在于图像的边缘中,主要表现为图像局部特征的不连续性,是图像中灰度变化比较强烈的地方,也即通常所说的信号发生奇异变化的地方。经典的边缘检测算法是利用边缘处的一阶导数取极值、二阶导数在阶梯状边缘处呈零交叉或在屋顶状边缘处取极值的微分算法。图像边缘检测一直是图像处理中的热点和难点。
近年来,随着数学和人工智能技术的发展,各种类型的边缘检测算法不断涌现,如神经网络、遗传算法、数学形态学等理论运用到图像的边缘检测中。但由于边缘检测存在着检测精度、边缘定位精度和抗噪声等方面的矛盾及对于不同的算法边缘检测结果的精度却没有统一的衡量标准,所以至今都还不能取得令人满意的效果。另外随着网络和多媒体技术的发展,图像库逐渐变得非常庞大;而又由于实时图像的目标和背景间的变化都不尽相同,如何实现实时图像边缘的精确定位和提取成为人们必须面对的问题。随着DSP芯片处理技术的发展,尤其是在图像处理方面的提高如TMS320C6000系列,为实现高效的、实时的边缘检测提供了可能性[5]。在经典的边缘检测算法中,Sobel边缘检测算法因其计算量小、实现简单、处理速度快,并且所得的边缘光滑、连续等优点而得到广泛的应用。本文针对Sobel算法的性能,并借助于TMS320DM642处理芯片[3],对该边缘检测算法进行了改进和对程序的优化,满足实时性需求。
2 Sobel边缘检测算法的改进
经典的Sobel图像边缘检测算法,是在图像空间利用两个方向模板与图像进行邻域卷积来完成的,这两个方向模板一个是检测垂直边缘,一个是检测水平边缘。算法的基本原理:由于图像边缘附近的亮度变化较大,所以可以把那些在邻域内,灰度变化超过某个适当阈值TH的像素点当作边缘点。Sobel算法的优点是计算简单,速度快。但由于只采用了两个方向模板,只能检测水平方向和垂直方向的边缘,因此,这种算法对于纹理较复杂的图像,其边缘检测效果欠佳;同时,经典Sobel算法认为,凡灰度新值大于或等于阈值的像素点都是边缘点。这种判定依据是欠合理的,会造成边缘点的误判,因为多噪声点的灰度新值也很大。
2.1 图像加权中值滤波
由于图像中的边缘和噪声在频域中均表现为高频成分,所以在边缘检测之前有必要先对图像进行一次滤波处理,减少噪声对边缘检测的影响。中值滤波是一种非线性信号的处理方法[2],在图像处理中,常用来保护边缘信息;保证滤波的效果。加权中值滤波,首先对每个窗口进行排序,取适当的比例,进行曲线拟合,拟合后的曲线斜率表征了此窗口的图像特征,再根据图像各部分特性适当的选择权重进行加权。
2.2 增加方向模板
除了水平和垂直两方向外,图像的边缘还有其它的方向,如135o和45o等,为了增加算子在某一像素点检测边缘的精度,可将方向模板由2个增加为8个即再在经典的方向模板的基础上增加6个方向模板,如图1所示。
2.3 边缘的定位及噪声的去除
通常物体的边缘是连续而光滑的,且边缘具有方向和幅度两个特征,而噪声是随机的。沿任一边缘点走向总能找到另一个边缘点,且这两个边缘点之间的灰度差和方向差相近。而噪声却不同,在一般情况下,沿任一噪声点很难找到与其灰度值和方差相似的噪声点[4]。基于这一思想,可以将噪声点和边缘点区分开来。对于一幅数字图像f(x,y),利用上述的8个方向模板Sobel算子对图像中的每个像素计算,取得其中的最大值作为该点的新值,而该最大值对应的模板所表示的方向为该像素点的方向。若|f(x,y)-f(x+i,y+j)|>TH2,对于任意i=0,1,-1;j=0,1,-1均成立,则可判断点(x,y)为噪声点。图2给出了图像边缘检测系统改进算法的软件流程图。

图1 边缘检测8个方向模板

图2 系统结构图
3 基于TMS320DM642的图像处理的设计及算法优化
3.1 TMS320DM642功能模块及图像处理系统的硬件结构
DSP以高速数字信号处理为目标进行芯片设计,采用改进的哈佛结构(程序总线和数据总线分开)、内部具有硬件乘法器、应用流水线技术、具有良好的并行性和专门用于数字信号处理的指令及超长指令字结构(VLIW)等特点;能完成运算量大的实时数字图像处理工作。
TMS320DM642是TI公式最近推出的功能比较强大的TMS320C6x系列之一,是目前定点DSP领域里性能较高的一款[6]。其主频是600MHz,8个并行运算单元、专用硬件逻辑、片内存储器和片内外设电路等硬件,处理能力可达4800MIPS。DM642基于C64x内核,并在其基础上增加了很多外围设备和接口,因而在实际工程中的应用更为广泛和简便。本系统使用50 MHz晶体震荡器作为DSP的外部时钟输入,经过内部锁相环12倍频后产生600 MHz的工作频率。DM642采用了2级缓存结构(L1和L2),大幅度提高了程序的运行性能。片内64位的EMIF(External Memory Interface)接口可以与SDRAM、Flash等存储器件无缝连接,极大地方便了大量数据的搬移。更重要的是,作为一款专用视频处理芯片,DM642包括了3个专用的视频端口(VP0~VP2),用于接收和处理视频,提高了整个系统的性能。此外,DM642自带的EMAC口以及从EMIF 口扩展出来的ATA口,还为处理完成后产生的海量数据提供了存储通道。
本系统是采用瑞泰公司开发的基于TI TMS320DM642 DSP芯片的评估开发板——ICETEK DM642 PCI。在ICETEK DM642 PCI评估板中将硬件平台分为五个部分,分别是视频采集、数据存储、图像处理、结果显示和电源管理。视频采集部分采用模拟PAL制摄像头,配合高精度视频A/D转换器得到数字图像。基于DSP的视频采集要求对视频信号具备采集,实时显示、对图像的处理和分析能力。视频A/D采样电路—SAA7115与视频端口0或1相连,实现视频的实时采集功能。视频D/A电路—SAA7105与视频口2相连,视频输出信号支持RGB、HD合成视频、PAL/NTSC复合视频和S端子视频信号。通过I2C总线对SAA7105的内部寄存器编程实现不同输出。
整个系统过程由三个部分组成:图像采集—边缘处理—输出显示,如图2所示。摄像头采集的视频信号经视频编码器SAA7115数字化,DM642通过I2C总线对SAA7115进行参数配置。在SAA7115内部进行一系列的处理和变换后形成的数字视频数据流,输入到核心处理单元DM642。经过DSP处理后的数字视频再经过SAA7105视频编码器进行D/A转换后在显示器上显示最终处理结果。
3.2 图像处理的软件设计和算法优化的实现
由于在改进Sobel边缘检测算子性能的同时,也相对增加了计算量,尤其是方向模板的增加,每个像素点均由原来的2次卷积运算增加为8次卷积运算,其实时性大大减弱。为了改进上述的不足,在深入研究处理系统和算法后,针对TMS320DM642的硬件结构特点,研究适合在TMS320DM642中高效运行的Sobel改进算法,满足实时处理的要求。整个程序的编写和调试按照C6000软件开发流程进行,流程分为:产生C代码、优化C代码和编写线性汇编程序3个阶段。使用的工具是TI的集成开发环境CCS。在CCS下,可对软件进行编辑、编译、调试、代码性能测试等工作。在使用C6000编译器开发和优化C代码时[7-8],对C代码中低效率和需要反复调用的函数需用线性汇编重新编写,再用汇编优化器优化。整个系统的控制以及数字图像处理是用C程序实现,大部分软件设计采用C程序实现,这无疑提高了程序的可读性和可移植性,而汇编程序主要是实现DM642的各部分初始化。其边缘检测优化算法在DM642中的实现步骤具体如下:
S1:根据DM642的硬件结构要求和控制寄存器设置,初始化系统并编写实现边缘检测算法的C程序。
S2:借助CCS开发环境的优化工具如Profiler等产生.OUT文件。
S3:根据产生的附件文件如.MAP文件,分析优化结果及源程序结构,进一步改进源程序和优化方法。
S4:使用CCS中调试、链接、运行等工具,再生成.OUT可执行文件。
S5:运行程序,如果满足要求则停止;否则重复步骤S2~S4直至满足使用要求。
4 实验结果
本文以Lena图像为例根据上述的硬件环境和算法实现的原理和方法,图4~图6分别给出了在该系统下采集的视频Lena图像及使用边缘检测算子和改进后处理的结果。由实验结果可以看出,在该系统下能实时完成视频图像的处理,并且给出的边缘检测算子能较好的消除噪声的影响,边缘轮廓清晰。该算法不仅能抑制图像中大部分噪声和虚假边缘,还保证了较高的边缘点位精度。

图4 Lena原始图像 图5 传统Sobel算子 图6 改进Sobel算子

5 总结
本文实现了在TMS320DM642评估板上用改进的Sobel算子对实时图像进行边缘检测,无延迟地得到边缘图像。边缘检测效果较好,既提高了图像检测的精度又满足了实时性的要求。从检测结果看,利用该改进后的算子在边缘精确定位、边缘提取都达到了很好的效果,且抗噪声能力强,并为目标跟踪、无接触式检测、自动驾驶、视频监控等领域的应用提供了坚实的基础。
参考文献
[1] 王磊等. 基于Sobel理论的边缘提取改善方法[J].中国图像图形学报,2005.10
[2] 陈宏席. 基于保持平滑滤波的Sobel算子边缘检测.兰州交通大学学报,2006,25(1):86—90
[3] 熊伟. 基于TMS320DM642的多路视频采集处理板卡硬件设计与实现[ M]. 国外电子元器件,2006
[4] 朱立.一种具有抗噪声干扰的图像边缘提取算法的研究[J].电子技术应用.2004,25(1)
[5] 刘松涛,周晓东.基于TMS320C6201的实时图像处理系统[J].计算机工程,2005(7):17—23
[6] TI TMS320DM642 video/imaging fixed-point digital signal processor data manual,2003
[7] TMS320C6x Optimizing C Compiler User’s Guide’ TEXAS INSTRUMENTS”,2002
[8] TMS320C32x Optimizing C/C++ Compiler User's Guide,Texas Instruments Incorporated,2001

⑦ C语言程序设计实验报告怎么写啊

通过本试验初步培养计算机逻辑解题能力。熟练掌握赋值语句和if语句的应用;掌握switch多路分支语句和if嵌套语句的使用

⑧ 一、实验目的 1.掌握用 C语言调试程序的基本方法。 2.掌握线性表的基本运算,如插入、删除等。 二、实验

#include
<stdio.h>

#include
<stdlib.h>

#define
MAXSIZE 20

typedef
int ElemType;

typedef
struct

{
ElemType a[MAXSIZE];

int
length;

}SqList;

SqList
a,b,c;

void
creat_list(SqList *L);

void
out_list(SqList L);

void
insert_sq(SqList *L,int i,ElemType e);

int
locat_sq(SqList L,ElemType e);

void
DeleteList(SqList *L,int i)

;

main()

{
int i,k,loc; ElemType e,x;

do
{ printf("\n\n\n");

printf("\n
1. creat " );

printf("\n
2. insert");

printf("\n
3. delete");

printf("\n
4. find");

printf("\n
5. end");

printf("\n***************");

printf("\n
input:1-5");

scanf("%d",&k);

switch(k)

{
case 1:{ creat_list(&a); out_list(a);} break;

case
2:{ printf("\n i,e=?"); scanf("%d,%d",&i,&e);

insert_sq(&a,i,e);
out_list(a);

}
break;

case
3:{ printf("\n i=?"); scanf("%d",&i);

DeleteList(&a,i);
out_list(a);

}
break;

case
4:{ printf("\n e=?"); scanf("%d",&e);

loc=locat_sq(a,e);

if
(loc==-1) printf("\n not find
%d",loc);

else
printf("\n find wei shi
%d",loc);

}
break;

}
/* switch */

}while(k!=5);

printf("\n
byebye");

printf("\n
enter,return");

}

void
creat_list(SqList *L)

{
int i;

printf("\n
n=?"); scanf("%d",&L->length);

for(i=0;i<L->length;i++){
printf("\t data %d=?",i);

scanf("%d",&(L->a[i]));

}

}
/* creat_list */

void
out_list(SqList L)

{
int i; char ch;

printf("\n");

for(i=0;i<=L.length-1;i++)
printf("%10d",L.a[i]);

printf("\n\n
");

}
/* out_list */

void
insert_sq(SqList *L,int i,ElemType e)

{
int j;

if
(L->length==MAXSIZE) printf("\n overflow !");

else
if(i<1||i>L->length+1) printf("\n erroe i !");

else
{ for(j=L->length-1; j>i-1; j--) L->a[j+1]=L->a[j];

L->a[j+1]=e;

L->length++;}

}
/* insert_sq */

int
locat_sq(SqList L, ElemType e)

{
int i=0;

while(i<=L.length-1
&& L.a[i]!=e) i++;

if(i<=L.length-1)
return(i+1);

else
return(-1);

}/*
locat_sq */

void
DeleteList(SqList *L,int i)

{

}

⑨ c语言程序设计实验报告

五、 课程设计小结心得体会
1设计思想
1)、设定一个一维数组,可先按员工序号设定每位员工的工资
2)、利用While语句和Prinft语句完成用户菜单的设计
功能为:第1项 设为员工编号和工资数据
第2项 设为修改员工工资数据
第3项 设为查询员工工资数据
第4项 设为结束系统
3)、当用户选择1、2项时,需输入员工编号,所以需要设计编号校正功能,如果出错可输出“The error employe number”
4)、当选择2时,进行工资数据的修改,并将新数据存回该员工的工资数组中
5)、利用for循环中判断语句,将用户工资数与数组中的工资数进行比较,如相同则输出,将计数器加1,如此下去,直到把整个数组遍历一遍
6)、判断计数器是否为0, 是0表示找不到相符的工资,如果不为0,则输出共查出几比相符的工资
以上当然里面也涉及了“函数的模块化”理念,可以避免但需要重复打印头文件时重复编写打印信头的语句。像这样的程序是多见的,这样不但降低了程序还发效率,而且耗时浪费资源“共用体”的使用简化了程序的“复杂”性,正如(4)中,学号与姓名同时表示一个人,但在函数使用了“共用体”,从而程序的简单可以便于纠错,查找问题,避免了代码的重复,这样就给编译时带来了一定的难度与“量”的繁杂。一般不采取这样的做法,力求“简单、明了、清晰”。

热点内容
内置存储卡可以拆吗 发布:2025-05-18 04:16:35 浏览:330
编译原理课时设置 发布:2025-05-18 04:13:28 浏览:371
linux中进入ip地址服务器 发布:2025-05-18 04:11:21 浏览:606
java用什么软件写 发布:2025-05-18 03:56:19 浏览:27
linux配置vim编译c 发布:2025-05-18 03:55:07 浏览:100
砸百鬼脚本 发布:2025-05-18 03:53:34 浏览:935
安卓手机如何拍视频和苹果一样 发布:2025-05-18 03:40:47 浏览:729
为什么安卓手机连不上苹果7热点 发布:2025-05-18 03:40:13 浏览:798
网卡访问 发布:2025-05-18 03:35:04 浏览:505
接收和发送服务器地址 发布:2025-05-18 03:33:48 浏览:367