您好,欢迎访问三七文档
《面向对象程序设计》课程设计报告学号:班级序号:姓名:指导老师:成绩:中国地质大学实习题目一【题目需求】给定一幅单波段影像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:定义控制台应用程序的入口点。//#includestdafx.h#includeDeviceContext.h#includeiostream#includefstream#includeiomanip#includeWindows.h#includemath.husingnamespacestd;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);myfileab;for(intj=0;ja;j++){myfilergb[j].Rrgb[j].Grgb[j].B;}myfileo.open(1-ImgData.txt);myfileos[0]s[1];//couts[0]s[1];该句用于先开始查看遥感图像像素点个数short**my=newshort*[s[0]];for(inti=0;is[0];i++)my[i]=newshort[s[1]];short**my1=newshort*[s[0]];for(inti=0;is[0];i++)my1[i]=newshort[s[1]];for(inti=0;is[0];i++){for(intj=0;js[1];j++){myfileomy[i][j];//从文件中读取}}for(inti=0;is[0];i++){for(intj=0;js[1];j++){my1[i][j]=my[i][j];}}for(inti=0;is[0];i++)//打印原始图像{for(intj=0;js[1];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;is[0]-1;i++)//用中值滤波器进行处理{for(intj=1;js[1]-1;j++){shorta[9];intk=0;for(intii=i-1;iii+2;++ii){for(intjj=j-1;jjj+2;++jj){a[k++]=my[ii][jj];for(intm=0;m5;++m){intmin=m;for(intn=m+1;n9;++n)if(a[n]a[min])min=n;inttemp=a[m];a[m]=a[min];a[min]=temp;}my1[i][j]=a[4];}}}}for(inti=0;is[0];i++)//打印图像{for(intj=0;js[1];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;i1;i++)//用中值滤波器处理边缘for(intj=1;js[1]-1;j++){shorta[5];intk=0;for(intii=i;iii+2;++ii){for(intjj=j-1;jjj+2;++jj){a[k++]=my[ii][jj];for(intm=0;m3;++m){intmin=m;for(intn=m+1;n5;++n)if(a[n]a[min])min=n;inttemp=a[m];a[m]=a[min];a[min]=temp;}intr=a[2];my1[i][0]=r;}}}for(intj=1;js[1];j++)//用附近点进行边缘处理my1[0][j]=my1[1][j];for(intj=1;js[1];j++)my1[s[0]-1][j]=my1[s[0]-2][j];for(inti=0;is[0];i++)//打印图像{for(intj=0;js[1];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_castchar*(&my1),sizeof(my1));//写入文件ifstreamfile1;file1.open(resImg.rs,ios_base::binary|ios_base::in);file1.read((char*)&my1,sizeof(my1));//for(inti=0;i20;i++)//仅用20*20样本对比监测数据//for(intj=0;j20;j++)//coutmy[j][i];for(inti=0;is[0];i++)//释放内存delete[]my[i];delete[]my;for(inti=0;is[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:定义控制台应用程序的入口点。//#includestdafx.h#includeiostream#includecstdlib#includeiomanip#includefstream#includestdlib.h#includetime.h#includecmathusingnamespacestd;#includeDeviceContext.hvoidsolve(intm,intnumber,float*x,float*y,float*p1){inti,j,k;得到噪声点最小二乘法得到拟合w值冒泡排序找到x最小值利用拟合系数算出x增加时y值并绘制曲线绘制多条进行对比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;knumber;k++){a[i][j]+=pow(x[k],i+j);}}for(k=0;knumber;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];}couty=a[0][m+1];for(i=1;i=m;i++){if(a[i][m+1]0)cout+;couta[i][m+1];for(intj=0;ji;j++){cout*x;}}for(inti=0;im;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;inumber;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];p100;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),**
本文标题:C++课程设计报告
链接地址:https://www.777doc.com/doc-5218195 .html