C++课程设计报告.docx

上传人:b****6 文档编号:8117384 上传时间:2023-01-28 格式:DOCX 页数:23 大小:293.05KB
下载 相关 举报
C++课程设计报告.docx_第1页
第1页 / 共23页
C++课程设计报告.docx_第2页
第2页 / 共23页
C++课程设计报告.docx_第3页
第3页 / 共23页
C++课程设计报告.docx_第4页
第4页 / 共23页
C++课程设计报告.docx_第5页
第5页 / 共23页
点击查看更多>>
下载资源
资源描述

C++课程设计报告.docx

《C++课程设计报告.docx》由会员分享,可在线阅读,更多相关《C++课程设计报告.docx(23页珍藏版)》请在冰豆网上搜索。

C++课程设计报告.docx

C++课程设计报告

《面向对象程序设计》

课程设计报告

 

学号:

班级序号:

姓名:

指导老师:

成绩:

 

中国地质大学

实习题目一

【题目需求】

给定一幅单波段影像imgData.txt(ASCII格式),实现对图像的处理和显示。

已知条件:

(1)clrTbl.txt文件是一个颜色查找表,大小是256X3,即可表示256中RGB的颜色。

(2)ImgData.txt文件中是图像的数据,每个值代表一个像素的颜色索引号,通过索引号到颜色查找表(clrTbl.txt文件)中找到相应的RGB颜色值。

(3)中值滤波:

一种非线性平滑技术,它将每一像素点的灰度值设置为该点某邻域窗口内(这里选择3X3)的所有像素点灰度值的中值。

(4)屏幕上显示像素点的函数:

SetPixel(HDCdrawDevice,longX,longY,COLORREFrgbVal);

基本要求:

(1)定义一个中值滤波器,并实现图像的中值滤波;

(2)将中值滤波的结果输出到二进制文件resImg.rs中;

拔高要求:

(3)在屏幕上分别显示原始图像和中值滤波结果图像。

 

【实现过程】

(1)思想:

首先构造结构体用来存储R/G/B,然后从文件中读取像素点的值利用颜色查找表打印出来,再利用中值滤波器对中间图像处理,边缘图像选用中值滤波器和靠内的像素覆盖来观察效果。

最后输出将中值滤波结果输出到二进制文件。

(2)实现过程:

 

 

【感想】

该程序的重点即在把制作中值滤波器用旁边点的中值代替中间点,思路较为明确,因而不是很难。

【附录】

源程序清单:

//中值滤波.cpp:

定义控制台应用程序的入口点。

//

#include"stdafx.h"

#include"DeviceContext.h"

#include

#include

#include

#include

#include

usingnamespacestd;

structmyRGB{

shortR;

shortG;

shortB;

};

int_tmain(intargc,_TCHAR*argv[])

{

inta,b;

myRGBrgb[256];

ints[2];

HWNDmmm;//获得句柄

HDChdc;

mmm=GetConsoleWindow();

hdc=GetDC(mmm);

ifstreammyfile;

ifstreammyfileo;

myfile.open("1-clrTbl.txt");

myfile>>a>>b;

for(intj=0;j

{

myfile>>rgb[j].R>>rgb[j].G>>rgb[j].B;

}

myfileo.open("1-ImgData.txt");

myfileo>>s[0]>>s[1];

//cout<

short**my=newshort*[s[0]];

for(inti=0;i

my[i]=newshort[s[1]];

short**my1=newshort*[s[0]];

for(inti=0;i

my1[i]=newshort[s[1]];

for(inti=0;i

{

for(intj=0;j

{

myfileo>>my[i][j];//从文件中读取

}

}

for(inti=0;i

{

for(intj=0;j

{

my1[i][j]=my[i][j];

}

}

for(inti=0;i

{

for(intj=0;j

{

intt=my[i][j];

intr=rgb[t].R;

intg=rgb[t].G;

intb=rgb[t].B;

SetPixel(hdc,j,i,RGB(r,g,b));

}

}

for(inti=1;i

{

for(intj=1;j

{

shorta[9];

intk=0;

for(intii=i-1;ii

for(intjj=j-1;jj

{

a[k++]=my[ii][jj];

for(intm=0;m<5;++m)

{

intmin=m;

for(intn=m+1;n<9;++n)

if(a[n]

min=n;

inttemp=a[m];

a[m]=a[min];

a[min]=temp;

}

my1[i][j]=a[4];

}

}

}

}

for(inti=0;i

{

for(intj=0;j

{

intt=my1[i][j];

intr=rgb[t].R;

intg=rgb[t].G;

intb=rgb[t].B;

SetPixel(hdc,j+330,i,RGB(r,g,b));

}

}

for(inti=0;i<1;i++)//用中值滤波器处理边缘

for(intj=1;j

{

shorta[5];

intk=0;

for(intii=i;ii

for(intjj=j-1;jj

{

a[k++]=my[ii][jj];

for(intm=0;m<3;++m)

{

intmin=m;

for(intn=m+1;n<5;++n)

if(a[n]

min=n;

inttemp=a[m];

a[m]=a[min];

a[min]=temp;

}

intr=a[2];

my1[i][0]=r;

}

}

}

for(intj=1;j

my1[0][j]=my1[1][j];

for(intj=1;j

my1[s[0]-1][j]=my1[s[0]-2][j];

for(inti=0;i

{

for(intj=0;j

{

intt=my1[i][j];

intr=rgb[t].R;

intg=rgb[t].G;

intb=rgb[t].B;

SetPixel(hdc,j,i+260,RGB(r,g,b));

}

}

ofstreamfile("resImg.rs",ios_base:

:

binary|ios_base:

:

out);

file.write(reinterpret_cast(&my1),sizeof(my1));//写入文件

ifstreamfile1;

file1.open("resImg.rs",ios_base:

:

binary|ios_base:

:

in);

file1.read((char*)&my1,sizeof(my1));

//for(inti=0;i<20;i++)//仅用20*20样本对比监测数据

//for(intj=0;j<20;j++)

//cout<

for(inti=0;i

delete[]my[i];

delete[]my;

for(inti=0;i

delete[]my1[i];

delete[]my1;

system("pause");

return0;

}

实现功能及效果

实习题目二

【题目需求】

样本点的多项式曲线拟合:

给定n个样本点(x,y),根据多项式曲线拟合公式,拟合出一条逼近的曲线函数。

已知条件:

(1)样本点的生成方法:

(sin()是余弦函数,rand()是随机函数)

y=sin(0.1*x)+noise;

其中,x=1~100,noise=rand(1~100)*0.3,noise是随机噪声。

(2)多项式曲线拟合公式:

y(x,w)=w0+w1*x1+w2*x2+…+wn*xn

(3)在程序输出窗口里绘制图形的函数:

DrawText(HDCdrawDevice,longX,longY,char*text);//在(x,y)处绘字符

MoveTo(HDCdrawDevice,longX,longY);//移动到某个点处

LineTo(HDCdrawDevice,longX,longY);//画线到某个点处

基本要求:

(1)根据给定的条件,计算出带噪声的样本点集合,并将其输出到文本文件samp.txt中;

(2)通过线性方程组求解,计算出多项式曲线拟合的系数wi(1<=i<=n),并将其输出;

拔高要求:

(3)将原始的样本点和求解的拟合曲线用不同的颜色绘制在窗口,进行显示对比;并通过调整多项式的次数,观察何时会发生过度拟合现象。

【实现过程】

(1)思想:

这个是比较复杂的。

首先得到噪声点,再用最小二乘法得到拟合曲线,用textout绘制噪声点,用冒泡排序法法找到x值最小的噪声点,以此找到对应y值,开始用求得的拟合系数来增加x值获得y值连线得到拟合曲线。

再绘制一次不同系数观察对比。

(2)

实现过程:

 

 

 

 

(【感想】

可以看出来最后打出来的曲线相当漂亮,利用冒泡排序法找出最小值因而曲线最终这么漂亮,谢了五堂课程设计课,十分辛苦完成的,拟合感觉也非常好。

恩,我很满意的作品。

【附录】//fw1.cpp:

定义控制台应用程序的入口点。

//

#include"stdafx.h"

#include

#include

#include

#include

#include

#include

#include

usingnamespacestd;

#include"DeviceContext.h"

voidsolve(intm,intnumber,float*x,float*y,float*p1)

{

inti,j,k;

float*w;

w=newfloat[m];

if(w!

=NULL){//利用最小二乘法求解

doublea[50][50]={0};

doublet;

for(i=0;i<=m;i++)

{

for(j=0;j<=m;j++)

{

for(k=0;k

{

a[i][j]+=pow(x[k],i+j);

}

}

for(k=0;k

{

a[i][j]+=y[k]*pow(x[k],i);

}

}

for(k=0;k<=m-1;k++)

{

for(i=k+1;i<=m;i++)

{

t=-a[i][k]/a[k][k];

for(j=k+1;j<=m+1;j++)

{

a[i][j]+=a[k][j]*t;

}

}

}

for(i=m;i>=0;i--)

{

for(j=i+1;j<=m;j++)

{

a[i][m+1]-=a[i][j]*a[j][m+1];

}

a[i][m+1]/=a[i][i];

}

cout<<"y="<

for(i=1;i<=m;i++)

{

if(a[i][m+1]>0)

cout<<"+";

cout<

for(intj=0;j

{

cout<<"*x";

}

}

for(inti=0;i

w[i]=a[i+1][m+1];

DeviceContextcontext;//获得句柄

HDChdc=context.GetCurDC();

HPENHPen=CreatePen(PS_SOLID,2,RGB(108,0,0));

SelectObject(hdc,HPen);

intz;

for(i=0;i

if(p1[0]==x[i])

z=y[i];

}

MoveToEx(hdc,p1[0]*5+100,768-(z*2+200),NULL);//从x值最小的点开始绘图

for(intp=p1[0];p<100;p++)

{

doubley=a[0][m+1];

for(intq=1;q<=m;q++)

y+=a[q][m+1]*pow((float)p,q);

//TextOut(hdc,p+100,768-(y+100),"**",1);

LineTo(hdc,p*5+100,768-(y*2+200));

}

cout<

delete[]w;

DeleteObject;

}

else

cout<<"error"<

}

voidsolve1(intm,intnumber,float*x,float*y,float*p2)//绘制对比曲线

{

inti,j,k;

float*w;

w=newfloat[m];

if(w!

=NULL){

doublea[50][50]={0};

doublet;

for(i=0;i<=m;i++)

{

for(j=0;j<=m;j++)

{

for(k=0;k

{

a[i][j]+=pow(x[k],i+j);

}

}

 

for(k=0;k

{

a[i][j]+=y[k]*pow(x[k],i);

}

}

for(k=0;k<=m-1;k++)

{

for(i=k+1;i<=m;i++)

{

t=-a[i][k]/a[k][k];

for(j=k+1;j<=m+1;j++)

{

a[i][j]+=a[k][j]*t;

}

}

}

for(i=m;i>=0;i--)

{

for(j=i+1;j<=m;j++)

{

a[i][m+1]-=a[i][j]*a[j][m+1];

}

a[i][m+1]/=a[i][i];

}

cout<<"y="<

for(i=1;i<=m;i++)

{

if(a[i][m+1]>0)

cout<<"+";

cout<

for(intj=0;j

{

cout<<"*x";

}

}

for(inti=0;i

w[i]=a[i+1][m+1];

DeviceContextcontext;

HDChdc=context.GetCurDC();

HPENHPen=CreatePen(PS_SOLID,2,RGB(0,105,105));

SelectObject(hdc,HPen);

intz;

for(i=0;i

if(p2[0]==x[i])

z=y[i];

}

MoveToEx(hdc,p2[0]*5+100,768-(z*2+200),NULL);

for(intp=p2[0];p<100;p++)

{

doubley=a[0][m+1];

for(intq=1;q<=m;q++)

y+=a[q][m+1]*pow((float)p,q);

//TextOut(hdc,p+100,768-(y+100),"**",1);

LineTo(hdc,p*5+100,768-(y*2+200));

}

cout<

delete[]w;

DeleteObject;

}

else

cout<<"error"<

}

int_tmain(intargc,_TCHAR*argv[])

{

for(;;){

intnumber,m;

cout<<"请输入w最高次数"<

cin>>m;

cout<<"请输入点的个数"<

cin>>number;

srand((unsigned)time(NULL));

float*x,*y,*p1;

POINT*point;

x=newfloat[number];

y=newfloat[number];

p1=newfloat[number];

point=newPOINT[number];

if(x!

=NULL){//判断内存是否申请成功

if(y!

=NULL){

if(point!

=NULL){

for(inti=0;i

{

x[i]=rand()%100;

p1[i]=x[i];

y[i]=100*sin(0.1*x[i])+(rand()%100)*0.3;//随机数的产生

//cout<

//cout<

}

for(intj=0;j

for(inti=0;i

if(p1[i]>p1[i+1])

{

inttemp=p1[i+1];

p1[i+1]=p1[i];

p1[i]=temp;

}

}

for(inti=0;i

{

point[i].x=x[i];

point[i].x=y[i];

}

ofstreamfile("samp.text",ios_base:

:

out);//记录带噪声的点的集合

file.write(reinterpret_cast(&point),sizeof(point));

DeviceContextdc;

HDChdc=dc.GetCurDC();

HPENHPen1=CreatePen(PS_SOLID,2,RGB(0,0,0));

SelectObject(hdc,HPen1);

MoveToEx(hdc,x[0]+100,768-(y[0]),NULL);

for(inti=0;i

{

TextOut(hdc,x[i]*5+100,768-(y[i]*2+200),"*",2);

}

solve(m,number,x,y,p1);

delete[]x;//释放内存

delete[]y;

DeleteObject;//删除画笔

intm1;

cout<<"请输入w最高次数"<

cin>>m1;

srand((unsigned)time(NULL));

float*x1,*y1,*p2;

POINT*point1;

x1=newfloat[number];

y1=newfloat[number];

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 高等教育 > 工学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1