*******************
实践教学
*******************
兰州理工大学
计算机与通信学院
2009年秋季学期
计算机图象处理综合训练
题 目: 图像噪声抑制和锐化程序设计 专业班级:
姓 名: 学 号: 指导教师: 成 绩:
目 录
摘 要 ....................................................................................................... 1 一、前言 ..................................................................................................... 2 二、算法分析与描述 ................................................................................ 3
2.1图像锐化——拉普拉斯算子 ........................................................................... 3 2.2 均值滤波 .......................................................................................................... 4
三、详细设计过程 .................................................................................... 5
3.1拉普拉斯锐化的实现 ......................................................................................... 5 3.2均值滤波的实现 ................................................................................................. 6
四、调试过程中出现的问题及相应解决办法 ........................................ 7 五.程序运行截图及其说明 .................................................................... 8 六、简单操作手册 .................................................................................. 10
6.1图像锐化操作步骤和显示操作过程的演示 ................................................. 10 6.2图像锐化操作步骤和显示操作过程的演示 ................................................. 12
设计总结 ................................................................................................... 14 参考资料 ................................................................................................... 15 致谢 ........................................................................................................... 16 附录1 ........................................................................................................ 17 附录2 ........................................................................................................ 20
2
摘 要
本次图象噪声抑制程序设计涉及到图像的滤波处理,通过均值滤波来实现噪声抑制。均值滤波方法是,对待处理的当前像素,选择一个模板,该模板为其近邻的若干像素组成,用模板中的像素均值来代替原像素值的方法。模板一般选择3×3,5×5,待处理的像素放在模板的中心。为了使输出像素值保持在原来的灰度范围内,模板的权值总和应维持为1。因此,模板与模板像素的乘积要除以一个系数,这个过程也被称为模板的归一化。图像锐化处理的目的是使边缘和轮廓线模糊的图像变得清晰或突出图像中的细节。锐化的强度与图像在该点的突变程度有关。图像锐化最常用的方法是梯度锐化法,但除梯度算法外,图像锐化的方法还有Roberts、Prewitt、Sobel和Laplacian等多种算法,本次图像锐化程序采用Laplacian算法,拉普拉斯算子是二阶微分算子,有着比一阶微分更加敏感的特性,尤其对斜坡渐变的细节。在图像处理中主要用VC++编写图像处理程序,并调用C++图像处理的部分内部函数进行处理。
关键词:均值滤波,噪声抑制,图像锐化
1
一、前言
图像是对客观存在物体的一种相似性的生动模仿与描述,可以反映人类第一感觉下的思维,给人们带来直观的信息,是人类获取信息的主要的来源,图像处理即数字图像处理,又称为计算机图像处理,它是指将图像信号转换成数字信号并利用计算机对其进行处理的过程。
图像信息在采集过程中往往受到各种噪声源的干扰,这些噪声在图像上常常表现为一些孤立像素点,这可理解为像素的灰度分布是空间相关的,即噪声点像素灰度与它们临近像素的灰度有着显著不同。这种干扰或孤立像素点如不经过滤波处理,会对以后的图像区域分割、分析和判断带来影响。对噪声的处理常用滤波方法有均值滤波,中值滤波,低通滤波,高通滤波等。通过这些滤波处理后,使图像的轮廓更加清晰,从而达到我们的要求。图像锐化是图像增强中空间域局部运算方法中的一种,其目的是增强和判断图像的边缘和轮廓信息。而图像锐化的具体方法就是通过微分而使图像边缘突出、清晰。由此知,图像具有带给人们的直观信息的特点,使得图像处理的技术随着计算机技术,多媒体技术的飞速发展取得了长足的进步。因为计算机主要研究处理数字图像,且计算机处理能力的不断增强,使得计算机图像处理的应用有了可实现的硬件基础。
2
二、算法分析与描述
2.1图像锐化——拉普拉斯算子
图像锐化中,通过对图像细节的灰度值分析知,图像中的细节是指画面中的灰度变化情况。反映数据变化的数学手段可以采用微分算子。从数学的微分含义来看,“一阶微分”是描述“数据的变化率”,“二阶微分”是描述“数据变化率的变化率”。 最简单的各向同性微分算子是拉普拉斯算子,一个二维图像f(x,y)的Laplacian算子定义
2f2f为:f=22
xy24f(x,y)f(x,y1)f(x,y1)f(x1,y)f(x1,y)]
由于Laplacian算子是线性二次微分算子,与梯度算子一样,具有旋转不变性,从而满足不同走向的图像边界的锐化要求。对阶跃状边缘,二阶导数在边缘点出现零交叉,即边缘点两旁二阶导函数取异号,据此,对数字图像{f(x,y)}的每个像素,Laplacian算子取它关于x轴方向和y轴方向的二阶差分之和。
2G(x,y)=2f(x,y)2+f(x,y)xyf(x,y)=f(x1,y)f(x1,y)
f(x,y1)f(x,y1)4f(x,y)
由于拉普拉斯是一种微分算子,他的应用强调图像中灰度的突变及降低灰度慢变换的区域。这将产生一幅把图像中的浅灰色边线和突变点叠加到暗背景中的图像。将原始图像和拉普拉斯图像叠加到一起的简单方法可以保护拉普拉斯锐化处理的效果,同时又能复原背景信息。
3
2.2 均值滤波
所谓均值滤波就是用若干像素的平均值替代原图像中的像素值。图像噪声的均值滤波方法如下:将一维均值滤波的原理拓展至二维图像,就可以实现图象噪声抑制。而图象的空间变换是借助于一个称之为模板的局部象素域来完成的。模板包括了图像上对待处理的像素及其周围的邻近像素。将模板中的全体像素的均值来替代原来的像素值的方法称为均值滤波。均值滤波的模板一般选择为3×3、5×5等,待处理像素放在模板的中心,为了使输出像素值保持在原来的灰度值范围内,模板的权值总和应维持为1。因此,模板与模板像素的乘积要除以一个系数(通常是模板系数之和),这个过程称为模板的归一化。典型的均值滤波3×3模板如下:
该模板的相应计算为:
H19111111111g(x,y)=[f(x-1,y-1)+f(x-1,y)+f(x-1,y+1)+f(x,y-1)+f(x,y)+f(x,y+1)+f(x+1,y-1)+f(x+1,y)+f(x+1,y+1)]/9
然后用g(x,y)的值代替中心象素的值。
另外,均值滤波有一个非常致命的弱点,就是在球均值的计算中,会同时将景物的边缘点也同时进行均值处理,这样就使得景物的清晰度降低,画面变得模糊。为了对其进行一定的改善,将以上的均值滤波器加以修正,可以采用加权平均的方式来构造滤波器,如高斯摸板等。典型的加权平均滤波器3×3高斯摸板如下:
H 2
116121242121 4
三、详细设计过程
3.1拉普拉斯锐化的实现 1.实现的设计步骤
1)取得原图的数据区指针。
2)开辟一个和原图相同大小的图像缓冲区,将原图复制到缓冲区。 3)设置Iirsch模板1参数,调用Templat()函数对缓存图像进行卷积计算。
4)将计算结果复制回原图。 2.编程实现的功能函数
/*************************************************************** *功能:用高斯拉普拉斯算子对图像边缘检测。
***************************************************************/ void BianYuanJianCeDib::Guasslaplacian() {
LPBYTE p_data; //原图数据区指针 int wide,height; //原图长、宽 int tempH; //模板高度 int tempW; //模板宽度 float tempC; //模板系数
int tempMY; //模板中心元素Y坐标 int tempMX; //模板中心元素X坐标 float Template[25]; //模板数组 p_data=this->GetData (); wide=this->GetWidth (); height=this->GetHeight ();
LPBYTE temp1=new BYTE[wide*height]; //新图像缓冲区 LPBYTE temp2=new BYTE[wide*height]; //新图像缓冲区
5
//拷贝原图像到缓存图像
memcpy( temp1,p_data,wide*height); memcpy( temp2,p_data,wide*height); //设置Guasslaplacian模板参数 /**************/ //调用Templat()函数
Templat( temp1,wide,height,tempH,tempW,tempMX,tempMY,Template,tempC);
memcpy(p_data, temp1,wide*height); //复制处理后的图像 delete temp1; //释放内存 delete temp2; 3.2均值滤波的实现
void CDlgSmooth::OnRadioAvertem() {
//判断设置是否有效
if((m_nSmthTemCenX<0)||(m_nSmthTemCenX>m_nSmthTemWidth-1)||(m_nSmthTemCenY<0)||(m_nSmthTemCenY>m_nSmthTemHeight-1)) {
//提示用户参数设置错误
MessageBox(\"中心元素参数设置错误!\",\"系统提示\", MB_ICONINFORMATION|MB_OK); //返回 return; } }
6
四、调试过程中出现的问题及相应解决办法
1、在此次课程设计过程中我遇到的最大的问题是如何将复杂的算法用程序描述出来,在查阅了很多资料后,我终于初步完成了对算法的编程。但后来在调试过程中又遇到了很多的问题,比如我所装的visual C++软件不正确,每次调试总有错误出现,后来重新安装后调试过程大部分的错误没有了,又有很多是由于粗心造成的,例如没有编写等头文件afsrex.h
2、我所做的程序所用作处理的图像必须是24位位图,不然就会出现以下错误信息;
7
五.程序运行截图及其说明
5.1程序编译成功运行后显示的主界面,打开文件夹中的图片如下:
5.1 加载原图片的效果
5.2拉普拉斯锐化处理后的图像
5.2 Laplacian微分算子处理效果
图5.2是通过拉普拉斯锐化处理的效果,表明二阶微分算子对图像细节的敏感性。
8
5.3程序编译成功运行后显示的主界面,打开文件夹中的图片如下:
5.3
未经处理的图像
5.4经过均值滤波处理后的图像,如下所示:
从图片效果可以看出,图像明显变模糊了。均值滤波有时处理图像的效果并不是很好
9
它虽然去除了一定的噪声,但同时使图像中的边缘变的模糊。
六、简单操作手册
6.1图像锐化操作步骤和显示操作过程的演示 1.打开运行后的主界面如下:
2.打开文件夹加载处理的图片文件显示如下:
3.成功打开处理的图片,显示如下:
10
4.在功能菜单项中选择顺序:“图像增强” 再在下拉菜单中点击“图像锐化”
11
5.点击“图像锐化”后的各选项就可以进行处理操作了,操作如下:
6.2图像锐化操作步骤和显示操作过程的演示 1.均值滤波操作同上1,2,3,到第三步时如下:
12
2.均值滤波最终操作如下:
13
设计总结
这次图像噪声抑制和图像锐化课程设计让我巩固了以前所学到的知识,在编程的过程中,对所学知识系统的进行了强化,掌握了在计算机图象处理技术的基础知识、基本原理和方法的基础上,使用计算机图象处理方法完成图像噪声抑制和图像锐化程序设计。在编写之前,要明确所要编写程序的功能,倘若不知道所要编的程序目的何在,那么编程时就会失去目标,程序自然编不好,还要明确编程思想,即在编程之前要对程序有一个总体的构思、总体的框架;这样编程时才能条理清晰,不致出现程序结构混乱这样的大错误。完成了总体设计之后,再进行详细设计、模块设计,这样编程时才能心中有数。经过此次设计,让我对所学知识、理论和方法得到巩固,提高了解决实际问题的能力。 因为课设是对所学知识的综合运用,需要反复的调试运行,解决复杂的问题,因为没有充分的准备,而且此次课设时间比较仓促,所以编程起来就感到很困难,但毕竟是经过自己努力完成的,在编写过程中,得到了老师和同学的帮助,才使我完成这次任务。
通过这次综合性的训练,我深刻体会到实践的重要性,只有通过亲手的操作才能把书本上学到的知识得以充分运用,还有同学之间的相互讨论也很重要。让我了解到了编程不是一件易事,这要求设计人员有清晰的思维能力把握实验中模块信息的连贯性,当然还需要有一定的编程能力。这使我意识到自己动手的能力还很差,以后在学习和工作的过程中一定要提高自己的动手能力。
14
参考资料
[1] 朱虹.计算机图象处理基础[M]. 科学出版社, 2005
[2] R C.Gonzalez, R E.Woods著,阮秋琦,阮宇智等译.计算机图象处理(第2版).北京:电子工业出版社,2003
[3] K.R.Castleman. 计算机图象处理.北京:电子工业出版社,2002 [4] 章毓晋.图像处理与分析-图像工程(上册),清华大学,2001 [5] 何斌等编著.Visual C++计算机图象处理.人民邮电出版社,2002
[6] 张宏林编著.Visual C++计算机图象模式识别技术及工程实践.人民邮电出版社,2003.
[7] 黄维通.Visual C++面向对象与可视化程序设计.清华大学出版社,2003
[8] R C.Gonzalez, R E.Woods, S L. Eddins著,阮秋琦,阮宇智等译.计算机图象处理(MATLAB版).北京:电子工业出版社,2005
15
致谢
我在此衷心的感谢耐心教导我的柯铭老师和热心帮助我的其他同学。这段时间的综合训练,我感受到老师的负责,通过和同学们的交流,才让我顺利完成了这次课设,这次综合训练我之所以能够顺利完成完全是因为老师的正确指导和同学的热心帮助。虽然这次课程设计过程中遇到了很多的困难,但最终还是顺利的完成了,我的整个综合训练都是在愉快的心情下进行的,我觉得我不仅巩固了课本知识还增长了实践能力。感谢学校为我提供了这次实践的机会。
16
附录1
图像锐化部分源代码: //高斯拉普拉斯算子函数
BOOL WINAPI GaussDIB(LPSTR lpDIBBits, LONG lWidth, LONG lHeight) {
// 指向缓存图像的指针
LPSTR lpDst1; LPSTR lpDst2;
// 指向缓存DIB图像的指针
LPSTR lpNewDIBBits1; HLOCAL hNewDIBBits1; LPSTR lpNewDIBBits2; HLOCAL hNewDIBBits2; int int
iTempH; // 模板高度 iTempW; // 模板宽度
FLOAT fTempC; // 模板系数 int int
iTempMX; // 模板中心元素X坐标 iTempMY; // 模板中心元素Y坐标
FLOAT aTemplate[25]; //模板数组
// 暂时分配内存,以保存新图像
hNewDIBBits1 = LocalAlloc(LHND, lWidth * lHeight); if (hNewDIBBits1 == NULL) { }
return FALSE; // 分配内存失败
// 锁定内存
lpNewDIBBits1 = (char * )LocalLock(hNewDIBBits1);
// 暂时分配内存,以保存新图像
17
hNewDIBBits2 = LocalAlloc(LHND, lWidth * lHeight); if (hNewDIBBits2 == NULL) { }
// 分配内存失败 return FALSE;
// 锁定内存
lpNewDIBBits2 = (char * )LocalLock(hNewDIBBits2);
// 拷贝源图像到缓存图像中
lpDst1 = (char *)lpNewDIBBits1;
memcpy(lpNewDIBBits1, lpDIBBits, lWidth * lHeight); lpDst2 = (char *)lpNewDIBBits2;
memcpy(lpNewDIBBits2, lpDIBBits, lWidth * lHeight);
// 设置Gauss模板参数
iTempW = 5;iTempH = 5 ;fTempC = 1.0; iTempMX = 3;iTempMY = 3; aTemplate[0] = -2.0; aTemplate[1] = -4.0; aTemplate[2] = -4.0; aTemplate[3] = -4.0; aTemplate[4] = -2.0; aTemplate[5] = -4.0; aTemplate[6] = 0.0; aTemplate[7] = 8.0; aTemplate[8] = 0.0; aTemplate[9] = -4.0; aTemplate[10] = -4.0; aTemplate[11] = 8.0; aTemplate[12] = 24.0; aTemplate[13] = 8.0; aTemplate[14] = -4.0; aTemplate[15] = -4.0; aTemplate[16] = 0.0; aTemplate[17] = 8.0; aTemplate[18] = 0.0; aTemplate[19] = -4.0; aTemplate[20] = -2.0; aTemplate[21] = -4.0; aTemplate[22] = -4.0; aTemplate[23] = -4.0; aTemplate[24] = -2.0;
// 调用Template()函数
if (!Template(lpNewDIBBits1, lWidth, lHeight, {
return FALSE;
iTempH, iTempW, iTempMX, iTempMY, aTemplate, fTempC))
18
}
// 复制经过模板运算后的图像到源图像
memcpy(lpDIBBits, lpNewDIBBits1, lWidth * lHeight);
// 释放内存 LocalUnlock(hNewDIBBits1); LocalFree(hNewDIBBits1); LocalUnlock(hNewDIBBits2); LocalFree(hNewDIBBits2);
return TRUE; // 返回
19
附录2
图像噪声抑制部分源程序:
* 函数名称:
* MedianFilter() *
* \\输入参数:
* CDib * pDib - 指向CDib类的指针,含有原始图象信息 * int nTempWidth - 模板的宽度 * int nTempHeight - 模板的高度 * int nTempCenX - 模板中心的X坐标(相对于模板) * int nTempCenY - 模板中心的Y坐标(相对于模板) *
* \\返回值: * BOOL - 成功则返回TRUE,否则返回FALSE *
* 说明:
* 该函数对指定的DIB图像进行均值滤波。 *
************************************************************************/
BOOL MedianFilter(CDib* pDib, int nTempWidth, int nTempHeight, int nTempCenX, int nTempCenY) { // 临时存放图像数据的指针 LPBYTE lpImage; // 循环变量 int i,j,k,l; // 指向源图像的指针 unsigned char* lpSrc; // 指向要复制区域的指针 unsigned char* lpDst;
// 图象的高度和宽度 CSize sizeImage;
sizeImage = pDib->GetDimensions();
// 获得图象数据存储的尺寸 int nSizeImage;
20
nSizeImage = pDib->GetSizeImage(); // 指向滤波器数组的指针
unsigned char* pUnchFltValue;
// 给临时存放数据分配内存
lpImage = (LPBYTE) new char[nSizeImage]; // 判断是否内存分配失败 if (lpImage == NULL) {
// 返回
return FALSE; }
// 将原始图像的数据拷贝到临时存放内存中
memcpy(lpImage, pDib->m_lpImage, nSizeImage);
// 暂时分配内存,以保存滤波器数组
pUnchFltValue = new unsigned char[nTempHeight * nTempWidth];
// 判断是否内存分配失败 if (pUnchFltValue == NULL) {
// 释放已分配内存 delete[]lpImage;
// 返回
return FALSE; }
// 开始中值滤波 // 行(除去边缘几行)
for(i = nTempCenY; i < sizeImage.cy - nTempHeight + nTempCenY + 1; i++) {
// 列(除去边缘几列)
for(j = nTempCenX; j < sizeImage.cx - nTempWidth + nTempCenX + 1; j++) {
// 指向新DIB第i行,第j个象素的指针
lpDst = (unsigned char*)lpImage + pDib->GetPixelOffset(i,j); //lpDst = (unsigned char*)lpImage + sizeImage.cx * (sizeImage.cy - 1 - i) + j; // 读取滤波器数组 for (k = 0; k < nTempHeight; k++) {
21
for (l = 0; l < nTempWidth; l++) { // 指向DIB第i - nTempCenY + k行,第j - nTempCenX + l个象素的指针 lpSrc = (unsigned char*)pDib->m_lpImage + pDib->GetPixelOffset(i-nTempCenY+k, j-nTempCenX+l); //lpSrc = (unsigned char*)pDib->m_lpImage + sizeImage.cx * (sizeImage.cy - 1 - i + nTempCenY - k) + j - nTempCenX + l; // 保存象素值 pUnchFltValue[k * nTempWidth + l] = *lpSrc; } } //* lpDst = GetMedianValue(pUnchFltValue, nTempHeight * nTempWidth); } } // 复制变换后的图像 memcpy(pDib->m_lpImage, lpImage, nSizeImage); // 释放内存 delete[]lpImage; delete[]pUnchFltValue; // 返回 return TRUE; }
/************************************************************************* *
* 函数名称:
* GetMedianValue() *
* 参数:
* unsigned char * pUnchFltValue - 指向要获取中值的数组指针 * int iFilterLen - 数组长度 *
* 返回值:
* unsigned char * *
************************************************************************/
22
unsigned char GetMedianValue(unsigned char * pUnchFltValue, int iFilterLen) { // 循环变量 int i; int j; // 中间变量 unsigned char bTemp; // 用冒泡法对数组进行排序 for (j = 0; j < iFilterLen - 1; j ++) { for (i = 0; i < iFilterLen - j - 1; i ++) { if (pUnchFltValue[i] > pUnchFltValue[i + 1]) { // 互换 bTemp = pUnchFltValue[i]; pUnchFltValue[i] = pUnchFltValue[i + 1]; pUnchFltValue[i + 1] = bTemp; } } } // 计算均值 if ((iFilterLen & 1) > 0) { // 数组有奇数个元素,返回中间一个元素 bTemp = pUnchFltValue[(iFilterLen + 1) / 2]; } else { // 数组有偶数个元素,返回中间两个元素平均值 bTemp = (pUnchFltValue[iFilterLen / 2] + pUnchFltValue[iFilterLen / 2 + 1]) / 2; } // 返回均值 return bTemp; }
23
24
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- huatuo7.cn 版权所有 湘ICP备2022005869号-9
违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务