1、图像处理及分析实验四 西华数学与计算机学院上机实践报告课程名称:计算机图形学年级: 2011上机实践成绩: 指导教师: 罗晓辉姓名: 徐千上机实践名称:图像增强学号:312011*上机实践日期:2013.10.27上机实践编号:4上机实践时间:14:00-18:00一、目的理解图像平滑、中值滤波以及拉普拉斯锐化基本原理,掌握基本的生成图像平滑、中值滤波以及拉普拉斯锐化算法,并实现图像平滑、中值滤波以及拉普拉斯锐化的图片效果,利用C+实现图像平滑、中值滤波以及拉普拉斯锐化的图片效果功能并处理图片效果。二、内容与设计思想内容:(1) 了解图像平滑、中值滤波以及拉普拉斯锐化原理。1、二维中值滤波平滑
2、:用中值算法把数字图像中一点的值用该点的一个邻域中各点值的中值代替,让周围的像素值接近的真实值,这样来过滤噪声,实现平滑。但是,这样产生出来的图像会有一定的模糊。2、梯度算法锐化:用微分的方法对图像处理,锐化因为平滑导致的模糊。3、拉普拉斯模糊:通过二阶微分像素变得跟周围4个像素一样。4、去除拉普拉斯模糊:将拉普拉斯模糊形式从原图像中去除。(2) 掌握基本的生成图像平滑、中值滤波以及拉普拉斯锐化算法(3) 利用C+分别实现生成图像平滑、中值滤波以及拉普拉斯锐化。(4) 利用该算法在屏幕上处理图片的效果。设计思想:图像平滑: 平滑后的像素灰度值即该像素周围九个点的灰度值分别乘以平滑模板对应元素,
3、再求它们之和,再取平均值步骤: 打开工作区,在图像处理实验算法下的CAView中EhanSmooth函数下编写程序 lpDIB 指向源图像的指针 lpDIBBits指向源图像像素起始位置的指针 lWidth是图像宽度 lHeight是图像高度 int a9平滑模板元素数组 a0=1; a1=1; a2=1;a3=1; a4=1; a5=1; a6=1; a7=1; a8=1; 注意图象的第一行,最后一行,第一列,最后一列跳过不处理; 中值滤波: 滤波后的像素灰度值即该像素周围九个点的灰度值的中值步骤: 打开工作区,在图像处理实验算法下的CAView中MedianFilter函数下编写程序 lp
4、DIB 指向源图像的指针 lpDIBBits指向源图像像素起始位置的指针 lWidth是图像宽度 lHeight是图像高度 注意图象的第一行,最后一行,第一列,最后一列跳过不处理; 拉普拉斯锐化: 每个像素灰度值即该像素周围九个点的灰度值分别乘以锐化模板对应元素,再求它们之和,再取平均值步骤: 打开工作区,在图像处理实验算法下的CAView中LSharp函数下编写程序 lpDIB 指向源图像的指针 lpDIBBits指向源图像像素起始位置的指针 lWidth是图像宽度 lHeight是图像高度 int a9锐化模板元素数组a0=0; a1=-1; a2=0;a3=-1; a4=5; a5=-1
5、;a6=0; a7=-1; a8=0; 注意图象的第一行,最后一行,第一列,最后一列跳过不处理;(4)仿照原理,编写代码,分别用图像平滑、中值滤波以及拉普拉斯锐化处理图片。(5)调试、编译、生成程序。(6)处理图片。三、使用环境Microsoft visual c+ 6.0Windows 7四、核心代码及调试过程.(实验结果)BOOL CAView:EhanSmooth(LPBYTE lpDIBBits, LONG lWidth, LONG lHeight) /* 说明:lpDIBBits是指向图象数据起始点的指针 lWidth是图像宽度 lHeight是图像高度*/ /*以下为可能涉及的指针
6、等*/ LPBYTE lpSrc;/像素指针 LONG lLineBytes;/每行字节数 lLineBytes=WIDTHBYTES(lWidth *8); long i,j; / 循环变量 int a9; /平滑模板元素数组 a0=1; a1=1; a2=1; a3=1; a4=1; a5=1; a6=1; a7=1; a8=1; /*请在下面编写图像平滑的算法*/ double *tempt=new doublelWidth*lHeight; int *b=new int9;int k;double sum,mean; for(i=1;ilHeight-1;i+) for(j=1;jlW
7、idth-1;j+) lpSrc=lpDIBBits+lLineBytes*i+j; b0=*(lpDIBBits+lLineBytes*(i-1)+j-1); b1=*(lpDIBBits+lLineBytes*(i-1)+j); b2=*(lpDIBBits+lLineBytes*(i-1)+j+1); b3=*(lpDIBBits+lLineBytes*i+j-1); b4=*(lpDIBBits+lLineBytes*i+j); b5=*(lpDIBBits+lLineBytes*i+j+1); b6=*(lpDIBBits+lLineBytes*(i+1)+j-1); b7=*(lp
8、DIBBits+lLineBytes*(i+1)+j); b8=*(lpDIBBits+lLineBytes*(i+1)+j+1); sum=0; mean=0; for(k=0;k9;k+) sum=sum+ak*bk; mean=sum/9; temptlWidth*i+j=mean; for(i=1;ilHeight-1;i+) for(j=1;j255) *lpSrc =(unsigned char)255; else *lpSrc =(unsigned char)temptlWidth*i+j; return TRUE;void CAView:OnMedianFilter() Bac
9、kForUndo(GetDocument()-GetHDIB(); / 获取文档 CADoc* pDoc = GetDocument(); / 指向DIB的指针 LPSTR lpDIB; / 锁定DIB lpDIB = (LPSTR) :GlobalLock(HGLOBAL) pDoc-GetHDIB(); / 源图像的宽度和高度 LONG lWidth; LONG lHeight; lWidth=:DIBWidth(lpDIB);/* 获取图像的宽度(4的倍数)*/ lHeight=:DIBHeight(lpDIB)/*获取图像的高度*/; / 指向DIB象素的指针 LPBYTE lpDIB
10、Bits; / 找到源DIB图像象素起始位置 lpDIBBits = (LPBYTE):FindDIBBits(lpDIB); / 创建新DIB HDIB hNewDIB = NULL; / 更改光标形状 BeginWaitCursor(); / 判断平滑是否成功 if (MedianFilter(lpDIBBits, lWidth, lHeight ) / 设置脏标记 pDoc-SetModifiedFlag(TRUE); / 更新视图 pDoc-UpdateAllViews(NULL); else / 提示用户 MessageBox(分配内存失败!); / 解除锁定 :GlobalUnlo
11、ck(HGLOBAL) pDoc-GetHDIB(); / 恢复光标 EndWaitCursor(); BOOL CAView:MedianFilter(LPBYTE lpDIBBits, LONG lWidth, LONG lHeight) /* 说明:lpDIBBits是指向图象数据起始点的指针 lWidth是图像宽度 lHeight是图像高度*/ /*以下为可能涉及的指针等*/ LPBYTE lpSrc;/像素指针 LONG lLineBytes;/每行字节数 lLineBytes=WIDTHBYTES(lWidth *8); long i,j; / 循环变量 /*请在下面编写中值滤波的
12、算法*/ int *tempt=new intlWidth*lHeight; unsigned char *b=new unsigned char9; for(i=1;ilHeight-1;i+) for(j=1;jlWidth-1;j+) lpSrc=lpDIBBits+lLineBytes*i+j; b0=*(lpDIBBits+lLineBytes*(i-1)+j-1); b1=*(lpDIBBits+lLineBytes*(i-1)+j); b2=*(lpDIBBits+lLineBytes*(i-1)+j+1); b3=*(lpDIBBits+lLineBytes*i+j-1); b
13、4=*(lpDIBBits+lLineBytes*i+j); b5=*(lpDIBBits+lLineBytes*i+j+1); b6=*(lpDIBBits+lLineBytes*(i+1)+j-1); b7=*(lpDIBBits+lLineBytes*(i+1)+j); b8=*(lpDIBBits+lLineBytes*(i+1)+j+1); temptlWidth*i+j=GetMedianNum(b, 9); for(i=1;ilHeight-1;i+) for(j=1;j255) *lpSrc =(unsigned char)255; else *lpSrc =(unsigned
14、 char)temptlWidth*i+j; return TRUE;unsigned char CAView:GetMedianNum(unsigned char *b, int num)/找中值(冒泡法) / 循环变量 int i; int j; / 中间变量 unsigned char f; / 用冒泡法对数组进行排序(b0 最小) for (j = 0; j num - 1; j +) for (i = 0; i bi + 1) / 互换 f = bi; bi = bi + 1; bi + 1 = f; / 计算中值 if (num & 1) 0) / 数组有奇数个元素,返回中间一个元
15、素 f = b(num + 1) / 2; else / 数组有偶数个元素,返回中间两个元素平均值 f = (bnum / 2 + bnum / 2 + 1) / 2; / 返回中值 return f;void CAView:OnEnhaLsharp() BackForUndo(GetDocument()-GetHDIB(); / 获取文档 CADoc* pDoc = GetDocument(); / 指向DIB的指针 LPSTR lpDIB; / 锁定DIB lpDIB = (LPSTR) :GlobalLock(HGLOBAL) pDoc-GetHDIB(); / 源图像的宽度和高度 LO
16、NG lWidth; LONG lHeight; lWidth=:DIBWidth(lpDIB);/* 获取图像的宽度(4的倍数)*/ lHeight=:DIBHeight(lpDIB)/*获取图像的高度*/; / 指向DIB象素的指针 LPBYTE lpDIBBits; / 找到源DIB图像象素起始位置 lpDIBBits = (LPBYTE):FindDIBBits(lpDIB); / 创建新DIB HDIB hNewDIB = NULL; / 更改光标形状 BeginWaitCursor(); / 判断锐化是否成功 if (LSharp(lpDIBBits, lWidth, lHeigh
17、t ) / 设置脏标记 pDoc-SetModifiedFlag(TRUE); / 更新视图 pDoc-UpdateAllViews(NULL); else / 提示用户 MessageBox(分配内存失败!); / 解除锁定 :GlobalUnlock(HGLOBAL) pDoc-GetHDIB(); / 恢复光标 EndWaitCursor(); BOOL CAView:LSharp(LPBYTE lpDIBBits, LONG lWidth, LONG lHeight) /* 说明:lpDIBBits是指向图象数据起始点的指针 lWidth是图像宽度 lHeight是图像高度 /*以下为
18、可能涉及的指针等*/ LPBYTE lpSrc;/像素指针 LONG lLineBytes;/每行字节数 lLineBytes=WIDTHBYTES(lWidth *8); long i,j; / 循环变量 int a9; /锐化模板元素数组 a0=0; a1=-1; a2=0; a3=-1; a4=5; a5=-1; a6=0; a7=-1; a8=0; /*请在下面编写图像锐化的算法*/double *tempt=new doublelWidth*lHeight; int *b=new int9;int k;double sum; for(i=1;ilHeight-1;i+) for(j=
19、1;jlWidth-1;j+) lpSrc=lpDIBBits+lLineBytes*i+j; b0=*(lpDIBBits+lLineBytes*(i-1)+j-1); b1=*(lpDIBBits+lLineBytes*(i-1)+j); b2=*(lpDIBBits+lLineBytes*(i-1)+j+1); b3=*(lpDIBBits+lLineBytes*i+j-1); b4=*(lpDIBBits+lLineBytes*i+j); b5=*(lpDIBBits+lLineBytes*i+j+1); b6=*(lpDIBBits+lLineBytes*(i+1)+j-1); b7
20、=*(lpDIBBits+lLineBytes*(i+1)+j); b8=*(lpDIBBits+lLineBytes*(i+1)+j+1); sum=0; for(k=0;k9;k+) sum=sum+ak*bk; temptlWidth*i+j=sum; for(i=1;ilHeight-1;i+) for(j=1;j255) *lpSrc =(unsigned char)255; else *lpSrc =(unsigned char)temptlWidth*i+j; return TRUE;运行结果如下:五、总结 基本了解了图像平滑、中值滤波以及拉普拉斯锐化的要点:对于在图片处理即平滑、滤波及锐化方面上有很重要的作用。掌握基本的图像平滑、中值滤波以及拉普拉斯锐化,并实现图像平滑、中值滤波以及拉普拉斯锐化的处理图片效果。在这次试验中,遇到了很多的难点,对自己的编程能力还有待提高。六、附录
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1