毕业设计图像预处理系统设计.doc

上传人:laozhun 文档编号:3974916 上传时间:2023-03-30 格式:DOC 页数:26 大小:243.50KB
返回 下载 相关 举报
毕业设计图像预处理系统设计.doc_第1页
第1页 / 共26页
毕业设计图像预处理系统设计.doc_第2页
第2页 / 共26页
毕业设计图像预处理系统设计.doc_第3页
第3页 / 共26页
毕业设计图像预处理系统设计.doc_第4页
第4页 / 共26页
毕业设计图像预处理系统设计.doc_第5页
第5页 / 共26页
点击查看更多>>
资源描述

《毕业设计图像预处理系统设计.doc》由会员分享,可在线阅读,更多相关《毕业设计图像预处理系统设计.doc(26页珍藏版)》请在三一办公上搜索。

1、第一章 引言1.1课题来源及意义本课题来源于科研需求。本课题主要研究的是针对打印或扫描中出现的图像进行背景去噪、灰度化、二值化等处理,得到较为干净的字符图像块。本课题主要对图像进行背景去噪、灰度化、二值化等处理,得到较为干净的字符图像块。随着科学技术的不断发展,计算机的更新速度不断提高,人们的思想文化素质的提高,对图像的要求也越来越高。因此把原始图像与计算机结合起来,从而创作出许多更加完美的图像,满足人们的需求。计算机图像处理,是指利用计算机对图像进行一系列加工,以便获得人们所需要的效果。图像是人类获取和交换信息的主要来源,人类感知外界信息,80%以上是通过视觉得到的。因此,图像处理的应用领域

2、必然涉及到人类生活和工作的方方面面。图像处理或图像分析方法的应用越来越广泛。1.2答题卡简介当今社会,为能够多方面评价个人能力,出现了名目繁多的考试,答题卡已不再陌生。答题卡一般由基本信息栏、导引道和很多信息位构成。 基本信息栏一般用于填写填涂这张卡片的使用者的基本信息,一般考试中包括考生的姓名和考号。导引道用于阅读机确认答题卡的方向和位置。而占据绝大部分位置的信息位则是供使用者填涂其所选择的选项。 答题后,答题卡上的信息通过光标阅读机识别并储存在计算机中。答题卡相比于传统纸答,有如下优点:1、普通纸答题卡。 印刷方便,长期使用节省成本。2、答题卡查询方便、影像化保存答题卡。对判卷结果有疑问,

3、输入学号或学生姓名可直接在电脑中查到这张答题卡和判卷细节。3、错误处理高效方便。 对于学号填涂错误、学号重复、主观题漏登分等错误情况处理方便,无需查找原始试卷,直接在电脑上调阅影像。4、统计与分析方便。 除基本统计参数外,提供排名、分数分布、试题合理性分析、多科成绩汇总与综合等功能。5、判卷速度快。每小时3600张试卷(标准32K答题卡)。6、升级空间。与网络技术结合,通过后续升级,可实现网络判卷功能。因此,答题卡技术是一项方便快捷的考试方式。1.3国内外发展现状研究表明,计算机中图像颜色处理技术是根据RGB三原色理论对色彩信息量化,再利用像素的点运算扫描整幅图像进行一一处理。位图图像一般分为

4、单色图像、灰度图像和彩色图像。单色图像只有黑色和白色两种颜色, 整个图像由单纯的黑色点和白色点组成。彩色图像的像素点是由R (红色)、G (绿色)、B (兰色) 三元色混合而成的,不同含量的R、G、B 组成不同的颜色,每一个记录单个像素的位数据单元可表示任意一种颜色。因此,要实现图像的灰度化处理,就是在0-255里划分一定的阈值,把图像分为黑、灰、白。为实现对图像的二值化处理,基于最大方差比的图像二值化算法能够准确而快速地对图像进行二值化,特别是当对象物和背景的灰度值的差具有一定大小的时候,效果更明显(柴本成, 2005);增强大津法和边缘检测阈值法确定的阈值对图像进行二值化处理,不仅可有效地

5、解决图像灰度随地物特征变化的图像处理问题, 同时对于同一信号源的图像也有相当理想的处理效果,该方法可进一步应用于图像分割等(吴冰,秦志远, 2001);文本图像的二值化方法可分为全局阈值方法和局部阈值方法,该方法自适应选取局部二值化时的窗口宽度,能有效消除一般二值化方法容易产生的断笔和伪影现象,同时吸收全局二值化方法的优点,保持较快的运算速度(庄军,李弼,程陈刚,2005);基于动态二值化的数学形态学边缘检测算法首先利用动态二值化方法确定将灰度图像转化为二值图像的阈值, 然后利用数学形态学的腐蚀和去空洞相结合的方法去除二值化图像的噪声, 最后用细化方法检测单像素图像边缘(汪毅,郭显久,2008

6、)。对图像去噪处理,国内外都提出了各自的见解。庄红林,施国兴等的图像修补算法首先将待修补图像分解为轮廓结构图像和纹理细节图像,再对轮廓结构图像的空缺进行轮廓结构修补,最后将修补后的轮廓结构图像及纹理合成后的纹理细节图像进行合成,得到需要的修补图像(庄红林,施国兴,2008);卢颖在基于小波变换的数字图像处理中提出小波变换是空间(时间)和频率的局部变化,能有效地从信号中提取信息,解决了傅里叶变换不能解决的许多问题,是一种有效地变换编码工具(卢颖,2009);Jean-Luc Starck, Emmanuel J. Cands, 和 David L. Donoho认为图像处理其基本的思想都是把减少

7、图像的模糊点进行到底,模糊点可以局部地处理掉,就像高斯滤波或各向异性过滤、通过可变的微积分、或者在范围波段,如韦纳滤波(Jean-Luc Starck, Emmanuel J. Cands, and David L. Donoho,2002)。1.4本文的主要工作目标本课题的目的是设计一个图像预处理系统。其功能包括对图像进行灰度化,二值化,去噪。基本功能 对图像进行图像进行背景去噪、灰度化、二值化等处理,得到较为干净的字符图像块。采用技术 对图像二值化处理,将256个亮度等级的灰度图像通过适当的阀值选取而获得仍然可以反映图像整体和局部特征的二值化图像。所有灰度大于或等于阀值的像素被判定为属于特

8、定物体,其灰度值为255表示,否则这些像素点被排除在物体区域以外,灰度值为0,表示背景或者例外的物体区域。如果某特定物体在内部有均匀一致的灰度值,并且其处在一个具有其他等级灰度值的均匀背景下,使用阀值法就可以得到比较的分割效果。如果物体同背景的差别表现不在灰度值上(比如纹理不同),可以将这个差别特征转换为灰度的差别,然后利用阀值选取技术来分割该图像。动态调节阀值实现图像的二值化可动态观察其分割图像的具体结果。对图像灰度化处理,根据YUV的颜色空间中,Y的分量的物理意义是点的亮度,由该值反映亮度等级,根据RGB和YUV颜色空间的变化关系可建立亮度Y与R、G、B三个颜色分量的对应:Y=0.3R+0

9、.59G+0.11B,以这个亮度值表达图像的灰度值。对图像的去噪处理,将采用均值变化方法。均值滤波也称为线性滤波,其采用的主要方法为领域平均法。线性滤波的基本原理是用均值代替原图像中的各个像素值,即对待处理的当前像素点(x,y),选择一个模板,该模板由其近邻的若干像素组成,求模板中所有像素的均值,再把该均值赋予当前像素点(x,y),作为处理后图像在该点上的灰度个g(x,y),即个g(x,y)=1/m f(x,y) m为该模板中包含当前像素在内的像素总个数。第二章 设计与实现2.1模块综述自主答题卡系统是根据用户的需求定制并生成答题卡,并对答题后的答题卡进行自动阅卷及成绩管理的一个系统,具有功能

10、多样、界面友好、自动化强的特点。图像预处理模块是对扫描仪扫描输入的答题卡图像进行处理。针对打印或扫描中出现的图像倾斜进行倾斜校正;对答题卡图像进行灰度化;对彩色或灰度图像进行二值化和去噪图像预处理模块应包含的内容有:图像输入、灰度化、二值化、去噪。2.2图像灰度化2.2.1图像的灰度化处理的基本原理将彩色图像转化成为灰度图像的过程成为图像的灰度化处理。彩色图像中的每个像素的颜色有R、G、B三个分量决定,而每个分量有255中值可取,这样一个像素点可以有1600多万(255*255*255)的颜色的变化范围。而灰度图像是R、G、B三个分量相同的一种特殊的彩色图像,其一个像素点的变化范围为255种,

11、所以在数字图像处理种一般先将各种格式的图像转变成灰度图像以使后续的图像的计算量变得少一些。灰度图像的描述与彩色图像一样仍然反映了整幅图像的整体和局部的色度和亮度等级的分布和特征。图像的灰度化处理可用两种方法来实现。第一种方法使求出每个像素点的R、G、B三个分量的平均值,然后将这个平均值赋予给这个像素的三个分量。第二种方法是根据YUV的颜色空间中,Y的分量的物理意义是点的亮度,由该值反映亮度等级,根据RGB和YUV颜色空间的变化关系可建立亮度Y与R、G、B三个颜色分量的对应:Y=0.3R+0.59G+0.11B,以这个亮度值表达图像的灰度值。2.2.2用Delphi进行图像灰度化的实现:proc

12、edure TForm1.BitBtn1Click(Sender: TObject);varp:PByteArray;/PByteArray的定义格式/PByteArray = TByteArray;/TByteArray = array0.32767 of Byte;ChangedBmp : Tbitmap;gray,x,y:integer;TestBMP : Tbitmap; / 处理过程中位图BeginTestBMP:=Tbitmap.Create;ChangedBmp:=Tbitmap.Create;TestBMP.Assign(image1.Picture);for y := 0 t

13、o TestBMP.Height - 1 dobegin/获取每一行象素信息p := TestBMP.scanliney;for x := 0 to TestBMP.Width - 1 dobegin/这里采用YUV与RGB颜色空间变换的方法,即 Y0.3R+0.59G+0.11BGray := Round(p3 * x + 2 * 0.3 + p3 * x + 1 * 0.59 + p3 * x * 0.11);/由于是24位真彩色,故一个像素点为三个字节p3 * x + 2 := byte(Gray);p3 * x + 1 := byte(Gray);p3 * x := byte(Gray

14、);/Gray的值必须在0255之间end;ChangedBmp.Assign(TestBMP);PaintBox1.Canvas.CopyMode:=srccopy;PaintBox1.Canvas.Draw(0,0,ChangedBmp);/用PaintBox控件重新绘制图像;end;2.2.3实现灰度化代码bool Convert256toGray(LPSTR lpDIB,LPSTR lpDIBBits,long lWidth,long lHeight) BYTE * lpSrc; / 指向DIB象素的指针 LONG lLineBytes; / 图像每行的字节数LPBITMAPINFO

15、lpbmi; / 指向BITMAPINFO结构的指针(Win3.0) LPBITMAPCOREINFO lpbmc; / 指向BITMAPCOREINFO结构的指针 lpbmi = (LPBITMAPINFO)lpDIB; / 获取指向BITMAPINFO结构的指针(Win3.0) lpbmc = (LPBITMAPCOREINFO)lpDIB; / 获取指向BITMAPCOREINFO结构的指针BYTE bMap256; / 灰度映射表/ 计算灰度映射表(保存各个颜色的灰度值),并更新DIB调色板int i,j;for (i = 0; i bmiColorsi.rgbRed + 0.587

16、* lpbmi-bmiColorsi.rgbGreen +0.114 * lpbmi-bmiColorsi.rgbBlue +0.5);*/bMapi = (BYTE)(306 * lpbmi-bmiColorsi.rgbRed + 601 * lpbmi-bmiColorsi.rgbGreen + 117 * lpbmi-bmiColorsi.rgbBlue + 512) 10 ); /修改后的优化算法/ 更新DIB调色板红色分量lpbmi-bmiColorsi.rgbRed = i; / 更新DIB调色板绿色分量lpbmi-bmiColorsi.rgbGreen = i; / 更新DIB调

17、色板蓝色分量lpbmi-bmiColorsi.rgbBlue = i;/ 更新DIB调色板保留位lpbmi-bmiColorsi.rgbReserved = 0;/ 计算图像每行的字节数lLineBytes = WIDTHBYTES(lWidth * 8);/ 更换每个象素的颜色索引(即按照灰度映射表换成灰度值)/逐行扫描for(i = 0; i lHeight; i+)/逐列扫描for(j = 0; j biSize;int dwData = lpDIBHdr-biSizeImage;int dwGrayData = dwData/3;int dwGrayPal = 256 * sizeof

18、(RGBQUAD); dwData=(lpDIBHdr-biHeight) * (lpDIBHdr-biWidth); int sizeTotal=dwInfo+dwGrayPal+dwData; /灰度图,颜色表长度为255HGLOBAL hGray=(HGLOBAL):GlobalAlloc(GMEM_MOVEABLE |GMEM_ZEROINIT, sizeTotal);if (hGray=0)return false; /内存分配失败则返回falselpGray = (LPSTR) :GlobalLock(hGray);/ 创建灰度图的颜色表 计算每个像素点的灰度值,即求平均即可RGB

19、QUAD* lpGrayRgbQuag=(RGBQUAD*)(lpGray+lpDIBHdr-biSize);char * lpBits = lpDIB + lpDIBHdr-biSize ;int rowLenSr=WIDTHBYTES(24*lpDIBHdr-biWidth);int rowLenDes=WIDTHBYTES(8*lpDIBHdr-biWidth);BYTE * lpGrayBits = (BYTE*)(lpGrayRgbQuag)+dwGrayPal;int aver=0;int i,j,k;if(24=lpDIBHdr-biBitCount) for(i=0;irgbB

20、lue=i; lpGrayRgbQuag-rgbGreen=i; lpGrayRgbQuag-rgbRed=i; lpGrayRgbQuag-rgbReserved=0; lpGrayRgbQuag+; for (i=0;ibiHeight;i+) for (j=0; jbiWidth; j+) k=i*rowLenSr+3*j;/* lpGrayBitsi*rowLenDes+j=(BYTE)(0.114*lpBitsk +0.587*lpBitsk+1 +0.299*lpBitsk+2 + 0.5);*/ lpGrayBitsi*rowLenDes+j=(BYTE) ( 117 * lpB

21、itsk + 601* lpBitsk+1 + 306* lpBitsk+2 + 512 ) 10 ); /修改后的优化算法 /修正需要补零的像素行 for (j=lpDIBHdr-biWidth;jbiSizeImage=sizeTotal;lpGrayHdr-biBitCount=8; lpGrayHdr-biClrUsed=256; :GlobalUnlock( hGray ); return (HGLOBAL) hGray;2.2.4注意事项:程序申请了TestBMP、WillbeChangedBmp,所以在程序初始化的时候,要注意创建:TestBMP:=Tbitmap.Create;

22、ChangedBmp:=Tbitmap.Create;程序结束后注意要把TestBMP.Destory和ChangedBmp.Destory;2.2.5程序效果图 原图 灰度化后图2.3图像二值化2.3.1二值化的基本原理和意义灰度图像是指只含亮度信息,不含色彩信息的图像。将彩色图像转化成为灰度图像的过程称为图像的灰度化处理。彩色图像中的每个像素的颜色有R、G、B三个分量决定,而每个分量有255种值可取,这样一个像素点可以有1600多万的颜色的变化范围。而灰度图像是R、G、B三个分量相同的一种特殊的彩色图像,一个像素点的变化范围为255种,所以在数字图像处理中一般先将各种格式的图像转变成灰度图

23、像以使后续的图像的计算量变得少一些。灰度图像的描述与彩色图像一样仍然反映了整幅图像的整体和局部的色度和亮度等级的分布和特征。图像的灰度化处理可先求出每个像素点的R、G、B三个分量的平均值,然后将这个平均值赋予给这个像素的三个分量。图像的二值化处理就是将图像上的点的灰度置为0或255,也就是使整个图像呈现出明显的黑白效果。即将256个亮度等级的灰度图像通过适当的阀值选取而获得仍然可以反映图像整体和局部特征的二值化图像。在数字图像处理中,二值图像占有非常重要的地位,特别是在实用的图像处理中,以二值图像处理实现而构成的系统是很多的,要进行二值图像的处理与分析,首先要把灰度图像二值化,得到二值化图像,

24、这样子有利于再对图像做进一步处理时,图像的集合性质只与像素的值为0或255的点的位置有关,不再涉及像素的多级值,使处理变得简单,而且数据的处理和压缩量小。二值图像在图像分析中应用非常广泛,二值图像就是指只有两个灰度级的图像,二值图像具有存储空间小,处理速度快,可以方便地对图像进行布尔逻辑运算等特点。更重要的是,在二值图像的基础上,还可以进一步对图像处理,获得该图像的一些几何特征或者其他更多特征。2.3.2用Delphi进行阈值调整的实现:vprocedure TForm1.Button1Click(Sender: TObject);var p:PByteArray; /PByteArray的定

25、义格式 /PByteArray = TByteArray; /TByteArray = array0.32767 of Byte; ChangedBmp : Tbitmap; gray,x,y:integer; TestBMP : Tbitmap; / 处理过程中位图begin TestBMP:=TBitmap.Create; changedbmp:=tbitmap.Create; testbmp.Assign(image1.Picture); for y:=0 to testbmp.Height-1 do begin p:=testbmp.ScanLiney; for x:=0 to tes

26、tbmp.Width-1 do begin /首先将图像灰度化 gray:=round(px*3+2*0.3+px*3+1*0.59+px*3*0.11); if gray TrackBar1.Position then /按阀值进行二值化 begin px*3:=255; px*3+1:=255; px*3+2:=255; end else begin px*3:=0;px*3+1:=0;px*3+2:=0; end; end; end; ChangedBmp.Assign(TestBMP); PaintBox1.Canvas.CopyMode:=srccopy; PaintBox1.Can

27、vas.Draw(0,0,ChangedBmp);end;2.3.3二值化程序void rectcoding(HDIB hDIB,int wRect,int hRect)/ 指向源图像象素的指针unsigned char *lpSrc;/ 指向DIB的指针LPSTRlpDIB;/ 指向DIB象素指针LPSTR lpDIBBits;/锁定并获得位图句柄的地址lpDIB = (LPSTR) :GlobalLock(HGLOBAL) hDIB);/ 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的模糊操作,其它的可以类推)if (:DIBNumColors(lpDIB) != 256)

28、/ 提示用户:AfxMessageBox (目前只支持256色位图的运算!);/ 返回return;/ 找到DIB图像象素起始位置lpDIBBits = :FindDIBBits(lpDIB);/图像处理操作/方块编码/获得图像的宽度和高度LONG lWidth=:DIBWidth (char*)lpDIB);LONG lHeight=:DIBHeight (char*)lpDIB);/ 计算图像每行的字节数LONG lLineBytes = WIDTHBYTES(lWidth * 8);if(lWidth!=lHeight)/ 提示用户:AfxMessageBox(只能对宽度和高度相等的图像

29、进行方块编码!);/ 返回return;/编码过程/循环变量LONG i,j,k;int ii,jj;double* Xt=new double lWidth*lHeight/(hRect*wRect);int Xi;int* a0=new int lWidth*lHeight/(hRect*wRect);int* a1=new int lWidth*lHeight/(hRect*wRect);int* N0=new int lWidth*lHeight/(hRect*wRect);int* N1=new int lWidth*lHeight/(hRect*wRect);/计算阈值k=0;fo

30、r (i = 0; i lHeight; i =i+hRect)for (j = 0; j lWidth; j =j+wRect)Xtk=0;/计算Xtfor(ii=0;iihRect;ii+)for(jj=0;jjwRect;jj+) / 指向图像指针lpSrc = (unsigned char *)lpDIBBits + lLineBytes * (i+ii) + (j+jj);Xi=*lpSrc;Xtk+=Xi;Xtk/=hRect*wRect;k+;/计算N0、N1k=0;for (i = 0; i lHeight; i =i+hRect)for (j = 0; j lWidth; j

31、 =j+wRect)N0k=0;N1k=0;/计算N0、N1for(ii=0;iihRect;ii+)for(jj=0;jjwRect;jj+) / 指向图像指针lpSrc = (unsigned char *)lpDIBBits + lLineBytes * (i+ii) + (j+jj);Xi=*lpSrc;if(XiXtk) N0k+;else N1k+;k+;/计算a0、a1k=0;for (i = 0; i lHeight; i =i+hRect)for (j = 0; j lWidth; j =j+wRect)a0k=0;a1k=0;/计算N0、N1for(ii=0;iihRect

32、;ii+)for(jj=0;jjwRect;jj+) / 指向图像指针lpSrc = (unsigned char *)lpDIBBits + lLineBytes * (i+ii) + (j+jj);Xi=*lpSrc;if(XiXtk) a0k+=Xi;else a1k+=Xi;if(N0k!=0&N1k!=0)a0k/=N0k;a1k/=N1k;k+;/二值化编码过程k=0;for (i = 0; i lHeight; i =i+hRect)for (j = 0; j lWidth; j =j+wRect)for(ii=0;iihRect;ii+)for(jj=0;jjwRect;jj+

33、) / 指向图像指针lpSrc = (unsigned char *)lpDIBBits + lLineBytes * (i+ii) + (j+jj);Xi=*lpSrc;if(XiXtk) Xi=a0k;else Xi=a1k;/赋新的像素值给像素*lpSrc=Xi;k+;:GlobalUnlock(HGLOBAL) hDIB);2.3.4程序效果图 原图 二值化后图2.4图像去噪2.4.1图像去噪基本原理均值滤波方法。均值滤波也称为线性滤波,其采用的主要方法为领域平均法。线性滤波的基本原理是用均值代替原图像中的各个像素值,即对待处理的当前像素点(x,y),选择一个模板,该模板由其近邻的若干

34、像素组成,求模板中所有像素的均值,再把该均值赋予当前像素点(x,y),作为处理后图像在该点上的灰度个g(x,y),即个g(x,y)=1/m f(x,y) m为该模板中包含当前像素在内的像素总个数。2.4.2去噪程序实现/* 函数名称:* MedianFilter()* 参数:* int iFilterH - 滤波器的高度* int iFilterW - 滤波器的宽度* int iFilterMX - 滤波器的中心元素X坐标* int iFilterMY - 滤波器的中心元素Y坐标* 说明:* 该函数对DIB图像进行中值滤波。*/#define iFilterW 1#define iFilter

35、H 1#define iFilterMX 1#define iFilterMY 1#define WIDTHBYTES(bits) (bits) + 31) / 32 * 4)unsigned char GetMedianNum(int * bArray, int iFilterLen);void MedianFilter(unsigned char *pImg1,unsigned char *pImg,int nWidth,int nHeigh unsigned char *lpSrc; / 指向源图像的指针 unsigned char *lpDst; / 指向要复制区域的指针int aVa

36、lueiFilterH*iFilterW; / 指向滤波器数组的指针int i,j,k,l; / 循环变量 int lLineBytes; / 图像每行的字节数 lLineBytes = WIDTHBYTES(nWidth * 8);for ( i=0;inWidth;i+,pImg+ )(*pImg)=0;/ 开始中值滤波/ 行(除去边缘几行)for(i = iFilterMY; i nHeight - iFilterH + iFilterMY + 1; i+) / 列(除去边缘几列)for(j = iFilterMX; j nWidth - iFilterW + iFilterMX + 1

37、; j+)/ 指向新DIB第i行,第j个象素的指针lpDst = pImg + lLineBytes * (nHeight - 1 - i) + j; / 读取滤波器数组for (k = 0; k iFilterH; k+)for (l = 0; l iFilterW; l+) / 指向DIB第i - iFilterMY + k行,第j - iFilterMX + l个象素的指针lpSrc = pImg1 + lLineBytes * (nHeight - 1 - i + iFilterMY - k) + j - iFilterMX + l;/ 保存象素值 aValuek * iFilterW + l = *lpSrc; / 获取中值* lpDst = GetMedianNum(aValue, iFilterH * iFilterW);unsigned char GetMedianNum(int * bArray, int iFilterLen)int i,j; / 循环变量unsigned char bTemp;/ 用冒泡法对数组进行排序for (j = 0; j iFilterLen - 1; j +)for (i = 0; i bArrayi + 1)/ 互换bTemp = bArrayi;bArrayi = bArrayi + 1;bArrayi + 1 = b

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 办公文档 > 其他范文


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号