C++课程设计报告.docx
- 文档编号:8117384
- 上传时间:2023-01-28
- 格式:DOCX
- 页数:23
- 大小:293.05KB
C++课程设计报告.docx
《C++课程设计报告.docx》由会员分享,可在线阅读,更多相关《C++课程设计报告.docx(23页珍藏版)》请在冰豆网上搜索。
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 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<<"+";
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C+ 课程设计 报告