《基于vc数字图像处理系统课程报告_毕业论文设计(17页).doc》由会员分享,可在线阅读,更多相关《基于vc数字图像处理系统课程报告_毕业论文设计(17页).doc(17页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、-基于vc数字图像处理系统课程报告_毕业论文设计-第 17 页毕业设计论文基于vc数字图像处理系统摘要:数字图像处理是从 20 世纪 60 年代以来随着计算机技术和 VLSI 的发展而产生、发展和不断成熟起一个新兴技术领域,它在理论上和实际应用上都取得了巨大的成就,并引起各方面人士的广泛重视。本实验研究基于VC平台的数字图像处理基本操作的方法,并在VC平台下实现。该软件可对数字图像实现基本的处理操作,包括对图像的点运算、几何变换以及部分正交变换的操作。该软件功能包括对图像的打开、图像处理的基本操作以及保存新生成的图像。关键字:数字图像处理、vc+6.0平台、vc+6.0编程工具一 引言 数字图
2、像处理采用一定的算法对数字图像进行处理,以获得人眼视觉或 者某种接受系统所需要的图像处理过程。图像处理的基础是数字,主要任务是进行各种算法设计和算法实现。通过界面实现显示原数字图像以及操作后的效果图。通过界面实现不同操作方法的选择、参数设置等,能通过编程实现对处理后的图像进行保存、生成新的图像文件,能实现不少于6种基本操作。其目的是进一步理解数字图像的原理、基本操作;掌握对数字图像处理操作的实现过程;学习使用Visual C+进行软件编程;熟悉数字图像文件的基本格式。二 设计流程及结果显示(1) 设计平台Visual C+6.0(2) 设计思想、框图及显示界面思想:首先建立OPEN()函数,然
3、后调用子程序OpenBMP(CString fileName)打开bmp位图,调用子程序DrawPic(unsigned char* pDa, int dx,int dy)显示图片。接着实现图像放大、图像缩小、反色、阈值变换、镜像变换、显示系统时间等功能。框图:调用子程序OpenBMP()打开图片调用子程序DrawPic()显示图片实现的功能图像放大图像缩小阈值变换反 色镜像变换时间显示对话框背景图平 移建立函数OPEN()开 始显示界面:(3)各模块功能及流程图a. 图像显示原理:调用OpenBMP()子程序打开图片,调用DrawPic()子程序显示图片。流程图:显示结果:b. 图像放大原理
4、: 最邻近点插值算法是最简单也是速度最快的一种算法,其做法是將放大后未知的像素点P,將其位置换算到原始影像上,与原始的邻近的4周像素点A,B,C,D做比较,令P点的像素值等于最靠近的邻近点像素值即可。这种方法会带来明显的失真。在A,B中点处的像素值会突然出现一个跳跃,这就是出现马赛克和锯齿等明显走样的原因。最临近插值法唯一的优点就是速度快。流程图:开始i=0,j=0in_heightj=0 & x1-m=0 & y1-nheight) /坐标(x1-m, y1-n) 在原图像范围内f(x1,y1) = f(x1-m, y1-n);else f(x1, y1) = 255;显示结果(x平移50,
5、y平移100):e.图像对称:原理:即以中心为原点构成坐标系,对图像进行x轴对称变换、y轴对称变换。比如,x轴对称变换:f(x1,y1) = f(width-x1, y1);y轴对称变换:f(x1,y1) = f(x1, height-y1)。显示结果:X对称:Y对称:原点对称:f图像阈值变换:原理:即选择一个阈值,对图像进行二值化。比如,设定阈值thr=100,则像素值小于100的像素值变为0,其他的像素值变为255。显示结果(阈值为45):g.图像反色:原理: 即将图像灰度值作如下变换:y1 = 255 - y0,y0为像素原始值,y1为像素反色后的值。显示结果:h.时间显示原理:显示结果
6、:i.灰度均衡化原理:流程图:显示结果:三 软件调试分析(1)显示图像前,需把以下代码添加到.h的文件中long g_height;long g_width; bool IsFirstDraw;tagRGBQUAD m_orgRGBQUAD256;unsigned char*OpenBMP(CString FileName);void DrawPic(unsigned char* pDa, int dx,int dy);CString m_szFileName;CString m_szFilePathName;以下代码添加到.cpp头文件中unsigned char* m_pImg;int g
7、_SvWth; long g_height;long g_width;(2)定义编辑框的变量时,变量的类型要对应程序变量的类型。四 结语五 参考文献精通Visual.C+数字图像处理典型算法及实现(第2版)张宏林.pdf数字图像处理实验指导六 源代码void CTDlg:OnOpen() / TODO: Add your control notification handler code hereUpdateData(true);CFileDialog dlg(true,NULL,NULL,OFN_OVERWRITEPROMPT,bmp(*.bmp)|*.bmp|,NULL);if(dlg.D
8、oModal()=IDOK)m_szFileName = dlg.GetFileName(); m_szFilePathName = dlg.GetPathName();else return;m_pImg =OpenBMP(m_szFilePathName);m_Width = n_width;m_Height = n_height; IsFirstDraw=FALSE;Invalidate(FALSE);/TRUE g_pDst =(unsigned char *) new char(n_width+(4-n_width%4)%4)*n_height;memcpy(g_pDst, m_pI
9、mg, (n_width+(4-n_width%4)%4)*n_height);DrawPic(m_pImg,0,0);UpdateData(false);unsigned char* CTDlg:OpenBMP(CString fileName)unsigned char * pData;int i=0,bitCount=0;CFile file;if(fileName=)return NULL;BITMAPINFOHEADER bmpInfoHead;BITMAPFILEHEADER bmpFileHead;if(file.Open(fileName,CFile:modeRead|CFil
10、e:shareDenyNone)=NULL)AfxMessageBox(Can not open the file);return NULL;file.Read(&bmpFileHead,sizeof(BITMAPFILEHEADER);/读文件头信息,返回值为实际读取的字节数/*&bmpFileHead是接收数据缓冲区的指针;第二个参数(sizeof(BITMAPFILEHEADER)指读出数据的字节数,起始地址为当前文件指针的地址*/file.Read(&bmpInfoHead,sizeof(BITMAPINFOHEADER);n_width = bmpInfoHead.biWidth;
11、n_height = bmpInfoHead.biHeight;n_SvWth =n_width+(4-n_width%4)%4;bitCount=bmpInfoHead.biBitCount;switch(bitCount)case 1:file.Read(m_orgRGBQUAD,2*sizeof(RGBQUAD);break;case 4:file.Read(m_orgRGBQUAD,8*sizeof(RGBQUAD);break;case 8:file.Read(m_orgRGBQUAD,256*sizeof(RGBQUAD);break;default : break;long lF
12、ileSize = bmpFileHead.bfSize - bmpFileHead.bfOffBits;pData = (unsigned char*)new charlFileSize;if(!pData)return NULL; file.ReadHuge(pData,lFileSize);/与file.Read(&bmpFileHead,sizeof(BITMAPFILEHEADER)函数一样,只是读取的数据块可以大于64Kfile.Close();return pData;/图像显示void CTDlg:DrawPic(unsigned char* pDa, int dx,int d
13、y)/根据传递的图像头指针和长宽显示图像int i,j,n;unsigned char m;CPoint P; CClientDC clientDc(this);n=n_width+(4-n_width%4)%4;for(i=0;in_height;i+)for(j=0;jn_width;j+)m=pDan*(n_height-i-1)+j;clientDc.SetPixel(j+dx+10,i+dy+10,RGB(m,m,m);/图像放大void CTDlg:OnFd() / TODO: Add your control notification handler code here int
14、i,j,x0,y0,n,m;double dx,dy;unsigned char da1,da2,da3,da4; UpdateData(true);n=n_width+(4-n_width%4)%4;for(i=0;in_height;i+)for(j=0;jn;j+)x0 = (int)(j/m_nFD);dx = j/m_nFD - x0;y0 = (int)(i/m_nFD);dy = i/m_nFD - y0;m=n_height-y0-1;da1 = m_pImgn*m+x0;da2 = m_pImgn*m+x0+1;da3 = m_pImgn*(m-1)+x0;da4 = m_p
15、Imgn*(m-1)+x0+1;g_pDstn*(n_height-i-1)+j = (int)(da1*(1-dx) + da2*dx)*(1-dy) + (da3*(1-dx) + da4*dx)*dy+0.5); /四舍五入DrawPic(g_pDst,n+10,0);UpdateData(false);/图像缩小void CTDlg:OnSx() / TODO: Add your control notification handler code hereint i,j,dx,dy,n,m;UpdateData(true);n=n_width+(4-n_width%4)%4;for(i
16、=0;in_height;i+)for(j=0;jn;j+)dx = (int)(j*m_nSX);dy = (int)(i*m_nSX);m=n_height-i-1;if( dx=n | dy=n_height ) g_pDstn*m+j = 255; else g_pDstn*m+j = m_pImgn*(m+i-dy)+dx;DrawPic(g_pDst,n+10,0);UpdateData(false);/图像平移void CTDlg:OnPy() / TODO: Add your control notification handler code hereint i,j,dx,dy
17、,n,m;UpdateData(true);n=n_width+(4-n_width%4)%4;for(i=0;in_height;i+)for(j=0;jn;j+)dx = j - m_nXPY;dy = i - m_nYPY;m=n_height-i-1;if( dx=n | dy=n_height )g_pDstn*m+j = 255; elseg_pDstn*m+j = m_pImgn*(m+i-dy)+dx;DrawPic(g_pDst,n+10,0);UpdateData(false);/图像x轴对称void CTDlg:OnXdc() / TODO: Add your contr
18、ol notification handler code here int i,j,n,m;UpdateData(true);n=n_width+(4-n_width%4)%4;for(i=0;in_height;i+)for(j=0;jn;j+)m=n_height-i-1;g_pDstn*m+j = m_pImgn*(m+1)-j;DrawPic(g_pDst,n+10,0);UpdateData(false);/图像y轴对称void CTDlg:OnYdc() / TODO: Add your control notification handler code here int i,j,
19、n,m;UpdateData(true);n=n_width+(4-n_width%4)%4;for(i=0;in_height;i+)for(j=0;jn;j+)m=n_height-i-1;g_pDstn*m+j = m_pImgn*i+j;DrawPic(g_pDst,n+10,0);UpdateData(false);/图像原点对称void CTDlg:OnYddc() / TODO: Add your control notification handler code here int i,j,n,m;UpdateData(true);n=n_width+(4-n_width%4)%
20、4;for(i=0;in_height;i+)for(j=0;jn;j+)m=n_height-i-1;g_pDstn*m+j = m_pImgn*(i+1)-j;DrawPic(g_pDst,n+10,0);UpdateData(false);/图像阈值变换void CTDlg:OnYz() / TODO: Add your control notification handler code hereint i,j,n,m;UpdateData(true);n=n_width+(4-n_width%4)%4;for(i=0;in_height;i+)m=n_height-i-1;for(j=
21、0;j=m_nYZ)g_pDstn*m+j = 255;elseg_pDstn*m+j = 0;DrawPic(g_pDst,n+10,0);UpdateData(false);/图像反色void CTDlg:OnFs() / TODO: Add your control notification handler code hereint i,j,n,m; UpdateData(true);n=n_width+(4-n_width%4)%4;for(i=0;in_height;i+)for(j=0;jn;j+)m=n_height-i-1;g_pDstn*m+j = 255-m_pImgn*m
22、+j;DrawPic(g_pDst,n+10,0);UpdateData(false);void CTDlg:OnTimer(UINT nIDEvent) / TODO: Add your message handler code here and/or call default UpdateData(true); CString strTime; CTime tm; tm=CTime:GetCurrentTime(); strTime=tm.Format(%Y-%m-%d %H:%M:%S); SetDlgItemText(IDC_TIME,strTime); /显示系统时间 UpdateD
23、ata(false);CDialog:OnTimer(nIDEvent);显示背景图片的操作步骤一:先用windows自带的绘图工具将自已选择的图片打开并另存为bmp格式图片存放于桌面步骤二:点击菜单栏上的“插入”“资源”“引入”,在弹出的对话框中选择之前保存的bmp图片,在bmp文件夹下,图片的ID自动设置成IDB_BITMAP1.步骤三:点“fileview”“Source Files”双击“xxDlg.cpp”进入到代码界面。步骤四:在CXXXDialog:OnPaint()中的else 后面添加如下代码 CPaintDC dc(this); CRect rc; GetClientRec
24、t(&rc); CDC dcMem; dcMem.CreateCompatibleDC(&dc); CBitmap bmpBackground; bmpBackground.LoadBitmap(IDB_BITMAP1); / IDB_BITMAP1为对应图的ID BITMAP bitmap; bmpBackground.GetBitmap(&bitmap); CBitmap* pbmpPri = dcMem.SelectObject(&bmpBackground); dc.StretchBlt(0,0,rc.Width(), rc.Height(), &dcMem,0,0,bitmap.bm
25、Width, bitmap.bmHeight, SRCCOPY);/图像灰度均衡化void CTDlg:OnBUThuidujh() /灰度均衡化 / TODO: Add your control notification handler code here int i,j,count,n=0,m,c,g=0;int grayNum256;int grayMap256; count=g_width+(4-g_width%4)%4;for (i=0; ig_height; i+) /读取原文件直方图for (j=0; jcount; j+) g=m_pImgDatacount*(g_height
26、-i-1)+j; /计算像素点的灰度级grayNumg+; /计算各个灰度级个数for (n=0; n256; n+) /重新定义灰度级c=0;for (m=0; m=n; m+)c+=grayNumm;grayMapn=(BYTE)(c*255/g_height/count);for (i=0; ig_height; i+) /生成新直方图for (j=0; jcount; j+) g=m_pImgDatacount*(g_height-i-1)+j; /计算像素点原灰度级g_pDstcount*(g_height-i-1)+j=grayMapg; /给像素点赋上新灰度级 DrawPic(g_pDst,count+10,0);