您好,欢迎访问三七文档
当前位置:首页 > IT计算机/网络 > 软件工程 > 《计算机图像处理》课程设计报告
《计算机图像处理》课程设计报告华东理工大学信息学院计算机系2013年5月15日题目灰值图像形态学专业计算机科学与技术班级学号姓名指导教师签名一.课程设计题目灰值图像形态学二.日期2013.4.3-2013.5.8三.环境(操作系统,开发语言)操作系统是Windows开发语言是VisualC++语言四.设计内容(设计要求)(1)开发一个基于VisualC++.NET2003(或更高版本)MFC的图像的形态学处理的程序,必须用CImage类作为图像处理的对象。(2)程序必须具备的功能:a)可选择文件名,读入并显示一张原始图像文件。b)在显示的原始图像旁边显示至少二张不同的形态学处理后的图像。五.说明(1)说明使用的二种图像处理方法的名称,并对这二种图像处理方法的效果进行比较说明:两种处理方法为:灰值形态学的腐蚀和灰值形态学的膨胀效果分析:灰值形态学腐蚀:就是把图像区域的内边界点变成背景,是区域缩小一圈。腐蚀可以消除目标图像所有边界点以及边界上的突出部分;分离两个目标之间的细小连通;腐蚀对于从一幅图像中去除一些小而无意义的目标是很有用的。算法中关键点是:g(j,k)=min{f(j,k),f(j,k+1),f(j-1,k+1),…,f(j+1,k+1)}灰值形态学膨胀:就是将区域的外边界变成对象点,使区域扩大一圈。膨胀运算把图像周围的点合并进图像;连通两个距离比较小的图像;在连接图像中的断续点和填补图像中的空洞是非常有用的。算法关键点是:g(j,k)=max{f(j,k),f(j,k+1),f(j-1,k+1),…,f(j+1,k+1)}(2)处理前后的截图处理效果一:处理效果二:(3)程序功能实现的关键函数及关键源代码关键函数和关键源代码如下:OnDraw():将工作画布WorkCanvas中的图像传送到屏幕画布CDC中voidCImageView::OnDraw(CDC*pDC){CImageDoc*pDoc=GetDocument();ASSERT_VALID(pDoc);if(!pDoc)return;intnWidth,nHeight;if(!WorkCanvas.IsNull()){nWidth=WorkCanvas.GetWidth();nHeight=WorkCanvas.GetHeight();WorkCanvas.BitBlt(*pDC,0,0,nWidth,nHeight,0,0,SRCCOPY);//用WorkCanvus的Bitblt()函数将WorkCanvus中的图象数据传送到画布(例如CClientDC或pDC)上}}CopyImage():CImage类对象之间的复制,工作画布复制到副本画布voidCopyImage(CImage*pNewImage,CImage*pOldImage){CDC*pDC,*pNewDC;intnWidth,nHeight,nBitsPerPixel;nWidth=pOldImage-GetWidth();nHeight=pOldImage-GetHeight();nBitsPerPixel=pOldImage-GetBPP();if(!pNewImage-IsNull())//目标位图非空pNewImage-Destroy();//删除目标位图pNewImage-Create(nWidth,nHeight,nBitsPerPixel,0);//建立CImage类对象新位图CopyColorTables(pNewImage,pOldImage);//复制调色板pDC=CDC::FromHandle(pOldImage-GetDC());//建立源位图CDCpNewDC=CDC::FromHandle(pNewImage-GetDC());//建立目标位图CDCpNewDC-BitBlt(0,0,nWidth,nHeight,pDC,0,0,SRCCOPY);//复制像素数据pOldImage-ReleaseDC();//释放CDC指针pNewImage-ReleaseDC();}IndexToGreyImage():索引图像变灰阶图像voidIndexToGreyImage(CImage*pNewImage,CImage*pOldImage){RGBQUADColorTabs[256];BYTEcOldPixel,cNewPixel;inti,y,x,nOldWidth,nOldHeight,nColorTableEntries;intRGBToGrey[256];if(pOldImage-GetBPP()==8){nOldWidth=pOldImage-GetWidth();nOldHeight=pOldImage-GetHeight();//建立新图像if(!pNewImage-IsNull())pNewImage-Destroy();//如果图像pNewImage非空,则清除原有图像(原位图)pNewImage-Create(nOldWidth,nOldHeight,8,0);//建立新图像//设置新图像的灰阶调色板for(i=0;i256;i++)ColorTabs[i].rgbBlue=ColorTabs[i].rgbGreen=ColorTabs[i].rgbRed=i;pNewImage-SetColorTable(0,256,ColorTabs);//设置新图像调色板//计算原图像调色板的RGB色彩数据与灰色数据关系nColorTableEntries=pOldImage-GetMaxColorTableEntries();pOldImage-GetColorTable(0,nColorTableEntries,ColorTabs);//取原索引图像调色板for(i=0;inColorTableEntries;i++)//将原索引图像的调色板每项的RGB三种颜色计算成灰色数据RGBToGrey[i]=(int)(0.11*ColorTabs[i].rgbBlue+0.59*ColorTabs[i].rgbGreen+0.30*ColorTabs[i].rgbRed);//修改原图像所有像素,将原索引图像每个对应RGB的数据修改为对应灰阶图像的数据for(y=0;ynOldHeight;y++)//逐行进行处理for(x=0;xnOldWidth;x++)//逐列进行处理{cOldPixel=(BYTE)GetPixelValue(pOldImage,x,y);//将原索引图像的像素按映射关系表变成灰阶图像中的像素cNewPixel=RGBToGrey[cOldPixel];SetPixelValueInIndexImage(pNewImage,x,y,cNewPixel);//写新的灰阶图像中的像素值}}}处理方法一:灰值形态学的腐蚀处理voidGreyErosion(CImage*pNewImage,CImage*pOldImage){inty,x,i,j,nWidth,nHeight;BYTEcMin,cPixelValue;CopyImage(pNewImage,pOldImage);//CImage类对象之间的复制nWidth=pOldImage-GetWidth();nHeight=pOldImage-GetHeight();for(y=1;ynHeight-1;y++)//逐行进行处理for(x=1;xnWidth-1;x++)//逐列进行处理{cMin=255;for(i=-1;i2;i++)for(j=-1;j2;j++){cPixelValue=(BYTE)GetPixelValue(pOldImage,x+j,y+i);if(cPixelValuecMin)cMin=cPixelValue;//寻找邻域极小(黑)值}SetPixelValueInIndexImage(pNewImage,x,y,cMin);//灰值形态学膨胀处理为邻域极小(黑)值}}voidCImageView::OnGreyErosion(){CClientDCdc(this);//屏幕画布CImageImage;intnStartX,nStartY,nCanvasDrawWidth;if(!WorkCanvas.IsNull())//如果工作画布WorkCanvas非空{SetFlagsToFalse();//清除所有标志//清除窗口CRectrectWindowSize;GetClientRect(&rectWindowSize);//取窗口矩形坐标ClearWindow(&dc,rectWindowSize);//清窗口//显示原始工作画布WorkCanvas图像nStartX=0;nStartY=0;nCanvasDrawWidth=DrawCanvas(&WorkCanvas,&dc,nStartX,nStartY);//将工作画布WorkCanvas图像转化成灰值图像并放在Image中IndexToGreyImage(&Image,&WorkCanvas);//对Image图像进行灰值形态学的腐蚀处理,处理结果放在SaveCanvas中GreyErosion(&SaveCanvas,&Image);//显示处理后的SaveCanvas图像nStartX+=nCanvasDrawWidth+10;DrawCanvas(&SaveCanvas,&dc,nStartX,nStartY);}}处理方法二:灰值形态的膨胀处理voidGreyDilation(CImage*pNewImage,CImage*pOldImage){inty,x,i,j,nWidth,nHeight;BYTEcMax,cPixelValue;CopyImage(pNewImage,pOldImage);//CImage类对象之间的复制nWidth=pOldImage-GetWidth();nHeight=pOldImage-GetHeight();for(y=1;ynHeight-1;y++)//逐行进行处理for(x=1;xnWidth-1;x++)//逐列进行处理{cMax=0;for(i=-1;i2;i++)for(j=-1;j2;j++){cPixelValue=(BYTE)GetPixelValue(pOldImage,x+j,y+i);if(cPixelValuecMax)cMax=cPixelValue;//寻找邻域极大(白)值}SetPixelValueInIndexImage(pNewImage,x,y,cMax);//灰值形态学膨胀处理为邻域极大(白)值}}voidCImageView::OnGreyDilation(){CClientDCdc(this);CImageImage;intnStartX,nStartY,nCanvasDrawWidth;if(!WorkCanvas.IsNull())//如果工作画布WorkCanvas非空{//显示原始工作画布WorkCanvas图像nStartX=0;nStartY=0;nCanvasDrawWidth=DrawCanvas(&WorkCanvas,&dc,nStartX,nStartY);//将工作画布WorkCanvas图像转化成灰值图像并放在Image中IndexToGreyImage(&Image,&WorkCanvas);//对Image图像进行灰值形态学膨胀处理,处理结果放在SaveCanvas中GreyDilation(&SaveCanvas,&Image);//显示SaveCanvas中处理后的图像nStartX+=2*(nCanvasDrawWidth+10);DrawCanvas(&SaveCanvas,&dc,nStartX,nStartY);}}
本文标题:《计算机图像处理》课程设计报告
链接地址:https://www.777doc.com/doc-6056227 .html