图像处理综合系统方案.docx

上传人:b****3 文档编号:4809065 上传时间:2023-05-07 格式:DOCX 页数:49 大小:1.46MB
下载 相关 举报
图像处理综合系统方案.docx_第1页
第1页 / 共49页
图像处理综合系统方案.docx_第2页
第2页 / 共49页
图像处理综合系统方案.docx_第3页
第3页 / 共49页
图像处理综合系统方案.docx_第4页
第4页 / 共49页
图像处理综合系统方案.docx_第5页
第5页 / 共49页
图像处理综合系统方案.docx_第6页
第6页 / 共49页
图像处理综合系统方案.docx_第7页
第7页 / 共49页
图像处理综合系统方案.docx_第8页
第8页 / 共49页
图像处理综合系统方案.docx_第9页
第9页 / 共49页
图像处理综合系统方案.docx_第10页
第10页 / 共49页
图像处理综合系统方案.docx_第11页
第11页 / 共49页
图像处理综合系统方案.docx_第12页
第12页 / 共49页
图像处理综合系统方案.docx_第13页
第13页 / 共49页
图像处理综合系统方案.docx_第14页
第14页 / 共49页
图像处理综合系统方案.docx_第15页
第15页 / 共49页
图像处理综合系统方案.docx_第16页
第16页 / 共49页
图像处理综合系统方案.docx_第17页
第17页 / 共49页
图像处理综合系统方案.docx_第18页
第18页 / 共49页
图像处理综合系统方案.docx_第19页
第19页 / 共49页
图像处理综合系统方案.docx_第20页
第20页 / 共49页
亲,该文档总共49页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

图像处理综合系统方案.docx

《图像处理综合系统方案.docx》由会员分享,可在线阅读,更多相关《图像处理综合系统方案.docx(49页珍藏版)》请在冰点文库上搜索。

图像处理综合系统方案.docx

图像处理综合系统方案

第16章图像处理综合系统

.chnfee.友情制作

本章导读

本章介绍以下2个综合系统:

◆画笔系统

◆综合图像处理系统

16.1画笔系统

综合前面所学过的有关图像处理特效的知识,编写图像处理综合系统。

此系统能够实现图片的浏览、放大和缩小、旋转、灰暗化,以与在图片上画出能够设置颜色和线条宽度的线。

16.1.1实例原理

应用通用对话框控制文件的打开,选取预设格式的图片加载到图片框中进行浏览。

在VB中Form,PictureBox和Printer都有PaintPicture方法,它们可以满足按一定比例对图片的大小进行缩小与放大的要求。

这个方法的功能是复制图像,其基本语法如下:

object.PaintPicturepicture,x1,y1,width1,height1,x2,y2,_width2,height2,opcode

这里的Picture来自Form等的Picture属性,而x1,y1是目标区域的左上角坐标,而x2,y2是源区域的左上角坐标,width1和height1是目标区域的宽度和高度,而width2和height2是源区域的宽度和高度,如果width1=width2且height1=height2,那么就是等比例复制,只需要选择适当的参数就可以实现图片的缩小与放大。

参数opcode是操作码,其含义可以参考WindowsAPI中关于BitBlt和StretchBlt函数的介绍。

对图像的旋转我们采用的是逐点计算法。

图像是由多个点组成的,如果将每一个点都按一定的角度进行旋转,整幅图像也就进行了旋转。

因此,图像的旋转就变为点的旋转,利用逐点计算的方法就可以实现整幅画面的旋转。

在图片上画图应用了鼠标的MouseDown,MouseUp和MouseMove事件,通过逻辑变量来控制画笔和橡皮是否可用,使用PictureBox控件的Line方法用鼠标点击相应的图标即可设置线条宽度DrawWidth属性。

16.1.2实例演示

运行该程序可看到如图16-1所示的图像处理综合系统界面。

在程序的主界面中,有两个PictureBox,左面的为“操作区域”,右面的为“对比区域”,“对比区域”用来与在“操作区域”载入图片进行放大、缩小等处理时的对比。

操作区域同时也具有画板的功能。

在“工具”栏中选择画笔工具,然后在“颜色”框中选择画笔颜色,接着在“线宽”栏中选择画笔的线宽,当在“操作区域”按下鼠标左键并移动鼠标时就可以实现画图功能了,橡皮工具可以把需要擦除的区域设置成背景色,以实现擦除的效果。

图像综合处理中的画图如图16-2所示。

图16-1图像处理综合系统界面

图16-2图像综合处理中的画图

载入图片后,画图工具仍然可用,你可以在图片上进行画图操作。

在“编辑”栏中点击“打开”命令按钮,选择图片载入程序,选择的图片将同时载入“操作区域”和“对比区域”,“操作区域”将根据图片的大小显示和隐藏滚动条,以便浏览图片,如图16-3所示。

载入图像后就可以对图片进行相应的操作,点击“编辑”栏中的“放大”命令按钮,“操作区域”中的图片行对于“对比区域”将被放大,你可以拉动水平或垂直滚动条来浏览放大后的图像(如图16-4所示)和缩小后的图像(如图16-5所示)。

在前面的多媒体学习中我们已经学习了图片的旋转,和这里的图片旋转完全一样。

点击“左旋”或“右旋”命令按钮,就能够使整副图片向左(如图16-6)或向右(如图16-7)旋转90°,如果想旋转更大的角度只需要多点击几次就可以实现,不过旋转的角度要是90的整数倍。

除了对调整图像大小和旋转图像,本程序还提供了画面变暗的效果,单击“编辑”栏中的“变暗”命令按钮,“操作区域”中的图片将会变暗,与“对比区域”形成鲜明的对比,如图16-8所示。

图16-3将图片载入程序图16-4浏览放大后的图像

图16-5浏览缩小后的图像图16-6向左旋转图片

图16-7向右旋转图片图16-8图片变暗

如果在图片上使用了画图工具或者将图片变暗后,当单击“编辑”栏中的“恢复”命令按钮后,“操作区域”就会恢复到图16-3时的载入状态。

单击“退出”按钮结束程序。

16.1.3实例实现

'由于篇幅有限,本案例代码被省略

'其代码请查看光盘,路径:

chap16\ex_01。

16.2综合图像处理系统

本节将介绍一个功能强大的数字图像处理系统。

通常,对于要求很高的数字图像处理,一般都是通过VisualC++来实现,在VisualBasic中,如果要进行大规模的图像处理,可以调用通过C++编译的动态库来实现。

但是很多时候,只需要使用到部分图像处理功能,或者对图像处理速度要求不是很高的时候,通过VisualBasic本身也能够进行各种数字图像的处理。

本节介绍的系统将提供以下功能:

(1)能够显示各种文件类型的图片;

(2)能够保存成多种文件格式的图片;

(3)能够实现图像漫游,浏览大图片的时候,可以通过鼠标拖动图片或者通过键盘方向键来移动大图片;

(4)能够选取图像;

(5)能够进行图像的复制粘贴;

(6)能够放大、缩小图像、查看原始图像大小、以与自适应显示图像即随着窗体的大小将图像全部显示在窗体中;

(7)能够撤销或者重复上一步的操作;

(8)当前编辑图像的状态显示;

(9)能够进行多种颜色之间的转化,如黑白图、16色灰度图、256色灰度图等;

(10)能够改变图像的大小;

(11)能够旋转图像;

(12)能够镜像图像;

(13)常用的图像参数调整,如饱和度调整、亮度调整、对比度调整;

(14)能够选取图像中任一像素的颜色值;

(14)常用的各种图像处理技术,如Greys、Negative、Sepia、Colorize、ReplaceHS、ReplaceL、Shift、Blur、Soften、Sharpen、Diffuse、Pixelaze、Despeckle、Contour、Emboss、Outline、Relieve、Noise、Scanlines、Dilate、Erode、Texturize等;

(15)各种常见的图像特效效果,如百叶窗效果、马赛克效果、翻页效果等;

(16)快速查看放大图像的局部位置;

16.2.1编程原理

本系统文件很多,设计了很多的编程技术和原理,下面就重点介绍其中的一些比较重要的编程技术和原理。

1.自定义控件开发

本系统中,使用了4个自定义的控件,分别是ucCanvas、ucInfo、ucProgress以与ucToolbar,这些控件都不是VisualBasic自带的,也不是第三方控件,而是通过VisualBasic提供的工具来开发的。

很多时候为了实现某个功能,或者实现代码的管理,自己开发一个控件是一个很好的选择。

开发自定义控件,很多语言都可以实现,如VisualC++、VisualBasic、Delphi等,在VisualBasic中开发控件,非常简单方便,下面简单介绍自定义开发组件的过程。

(1)创建或者添加自定义控件工程

如果是创建一个单独的控件,则需要创建一个自定义控件工程,如果已经创建了一个工程,则可以添加自定义控件,下面介绍如何开发一个自定义控件工程。

启动VisualBasic,如图16-9所示。

在图16-9中,选择“AciveX控件”,然后单击[打开]按钮,创建后界面如图16-10所示。

图16-9创建AcitiveX控件图16-10控件界面

从图16-10中可以看到,自定义控件的开发界面同普通的VisualBasic应用程序窗体开发一样,因此大部分的VisualBasic自带的控件,都可以被加入到控件容器中。

编者手记

如果已经创建了一个工程,需要在该工程中添加控件,则可以通过菜单[工程][添加用户控件],来添加自定义控件。

(2)添加属性和方法

为了能够让用户能够使用该控件,总是需要为该控件添加一些属性和方法,下面介绍为控件添加属性和方法。

在控件中添加属性主要是通过“PublicPropertyLet”和“PublicPropertyGet”两个方法来实现,下面来看看控件“ucInfo”的“TextFile”属性定义过程。

'以下两个函数定义了属性TextFile

'该函数用于设定属性TextFile的值

PublicPropertyLetTextFile(ByValNew_TextFileAsString)

m_TextFile=New_TextFile

CallRefresh

EndProperty

'该函数用于获得属性TextFile的值

PublicPropertyGetTextFile()AsString

TextFile=m_TextFile

EndProperty

而在控件中定义方法则比较简单,直接通过关键词“Public”定义一个函数或者过程即可,如在“ucToolbar”控件中定义的“BuildToolbar”方法如下:

PublicFunctionBuildToolbar(ImageAsStdPicture,ByValMaskColorAsOLE_COLOR,ByValIconSizeAsInteger,OptionalByValFormatMaskAsString)AsBoolean

'省略代码

EndFunction

因此如果在其他工程中引用了该控件,则可以同使用其他控件一样使用这些定义的属性和方法,如下所示:

ucInfo.TextFile="hello"

myText=ucInfo.TextFile

ucToolbar.BuildToolbar(LoadResPicture("BITMAP_TBQUICK",vbResBitmap),&HFF00FF,16,"NNN|NN|OO|NNN|C|NN|NNN|NNN|NN")

(3)编译成OCX控件

如果是在当前工程中使用该控件,则不需要编译,而如果为了让其他用户或者工程能够方便的使用该工程,则需要将控件编译成OCX控件,编译的过程很简单,选择菜单[文件][生成工程1.OCX],其中“工程1”为创建的自定义控件工程的名称,用户可以通过工程属性修改。

2.API的应用

由于本系统是进行图像处理,众所周知,数字图像一般都比较大,如果使用VisualBasic自带的一些图像控件来进行各种图像处理,则会极大的影响速度。

为了加快速度,本系统中了很多的API函数,下面解释一些本系统中比较重要的API函数。

(1)CreateDIBSection函数创建一个存储DIB位的存区域,既可以执行相应的GDI操作,又可以直接通过指向DIB位区域的指针方位DIB位区域。

这是一个非常有用的函数,通过它我们可以用DIB替代DDB。

PrivateDeclareFunctionCreateDIBSectionLib"gdi32"(ByValhDCAsLong,lpBitsInfoAsBITMAPINFOHEADER,ByValwUsageAsLong,lpBitsAsLong,ByValhandleAsLong,ByValdwAsLong)AsLong

(2)CreateCompatibleDC函数创建一个与特定设备场景一致的存设备场景

PrivateDeclareFunctionCreateCompatibleDCLib"gdi32"(ByValhDCAsLong)AsLong

(3)CreateCompatibleBitmap函数创建一幅与设备有关位图,它与指定的设备场景兼容

PrivateDeclareFunctionCreateCompatibleBitmapLib"gdi32"(ByValhDCAsLong,ByValnWidthAsLong,ByValnHeightAsLong)AsLong

(4)DeleteDC函数删除专用设备场景或信息场景,释放所有相关窗口资源。

PrivateDeclareFunctionDeleteDCLib"gdi32"(ByValhDCAsLong)AsLong

(5)GetObject函数取得对指定对象进行说明的一个结构。

windows手册建议用GetObject这个名字来引用该函数。

PrivateDeclareFunctionGetObjectLib"gdi32"Alias"GetObjectA"(ByValhObjectAsLong,ByValnCountAsLong,lpObjectAsAny)AsLong

(6)GetObjectType函数判断由指定句柄引用的GDI对象的类型

PrivateDeclareFunctionGetObjectTypeLib"gdi32"(ByValhgdiobjAsLong)AsLong

(7)SelectObject函数用于选择对象。

每个设备场景都可能有选入其中的图形对象。

其中包括位图、刷子、字体、画笔以与区域等等。

一次选入设备场景的只能有一个对象。

选定的对象会在设备场景的绘图操作中使用。

例如,当前选定的画笔决定了在设备场景中描绘的线段颜色与样式。

PrivateDeclareFunctionSelectObjectLib"gdi32"(ByValhDCAsLong,ByValhObjectAsLong)AsLong

(8)DeleteObject函数删除GDI对象,比如画笔、刷子、字体、位图、区域以与调色板等等。

对象使用的所有系统资源都会被释放。

PrivateDeclareFunctionDeleteObjectLib"gdi32"(ByValhObjectAsLong)AsLong

(9)BitBlt函数将一幅位图从一个设备场景复制到另一个。

源和目标DC相互间必须兼容。

PrivateDeclareFunctionBitBltLib"gdi32"(ByValhDestDCAsLong,ByValxAsLong,ByValyAsLong,ByValnWidthAsLong,ByValnHeightAsLong,ByValhSrcDCAsLong,ByValxSrcAsLong,ByValySrcAsLong,ByValdwRopAsLong)AsLong

(10)StretchBlt函数将一幅位图从一个设备场景复制到另一个。

源和目标DC相互间必须兼容。

这个函数会在设备场景中定义一个目标矩形,并在位图中定义一个源图像。

源矩形会根据需要进行伸缩,以便与目标矩形的大小相符。

PrivateDeclareFunctionStretchBltLib"gdi32"(ByValhDCAsLong,ByValxAsLong,ByValyAsLong,ByValnWidthAsLong,ByValnHeightAsLong,ByValhSrcDCAsLong,ByValxSrcAsLong,ByValySrcAsLong,ByValnSrcWidthAsLong,ByValnSrcHeightAsLong,ByValdwRopAsLong)AsLong

(11)SetStretchBltMode函数指定StretchBlt和StretchDIBits函数的伸缩模式。

这种伸缩模式定义了Windows如何对伸缩过程中剔除的扫描线进行控制。

对于VB窗体和控件,倘若在API绘图过程中使用这个函数,建议恢复原来的StretchBlt模式。

PrivateDeclareFunctionSetStretchBltModeLib"gdi32"(ByValhDCAsLong,ByValnStretchModeAsLong)AsLong

(12)GetDIBColorTable函数选入设备场景的DIBSection中取得颜色表信息

PrivateDeclareFunctionGetDIBColorTableLib"gdi32"(ByValhDCAsLong,ByValun1AsLong,ByValun2AsLong,lpRGBQuadAsAny)AsLong

(13)GetDIBits函数将来自一幅位图的二进制位复制到一幅与设备无关的位图里

PrivateDeclareFunctionGetDIBitsLib"gdi32"(ByValaHDCAsLong,ByValhBitmapAsLong,ByValnStartScanAsLong,ByValnNumScansAsLong,lpBitsAsAny,lpbiAsAny,ByValwUsageAsLong)AsLong

(14)SetRect函数设置指定矩形的容

PrivateDeclareFunctionSetRectLib"user32"(lpRectAsRECT2,ByValx1AsLong,ByValy1AsLong,ByValx2AsLong,ByValy2AsLong)AsLong

(15)FillRect函数用指定的刷子填充一个矩形

PrivateDeclareFunctionFillRectLib"user32"(ByValhDCAsLong,lpRectAsRECT2,ByValhBrushAsLong)AsLong

(16)CreateSolidBrush函数用纯色创建一个刷子

PrivateDeclareFunctionCreateSolidBrushLib"gdi32"(ByValcrColorAsLong)AsLong

(17)CreatePalette函数创建调色板

PrivateDeclareFunctionCreatePaletteLib"gdi32"(lpLogPaletteAsAny)AsLong

(18)GetDC函数获取指定窗口的设备场景

PrivateDeclareFunctionGetDCLib"user32"(ByValhWndAsLong)AsLong

(19)GetDesktopWindow函数获得代表整个屏幕的一个窗口(桌面窗口)句

PrivateDeclareFunctionGetDesktopWindowLib"user32"()AsLong

(20)ReleaseDC函数释放由调用GetDC或GetWindowDC函数获取的指定设备场景。

它对类或私有设备场景无效

PrivateDeclareFunctionReleaseDCLib"user32"(ByValhWndAsLong,ByValhDCAsLong)AsLong

(21)OpenClipboard函数打开剪贴板

PrivateDeclareFunctionOpenClipboardLib"user32"(ByValhWndAsLong)AsLong

(22)CloseClipboard函数关闭剪贴板

PrivateDeclareFunctionCloseClipboardLib"user32"()AsLong

(23)SetClipboardData函数设定剪贴板的数据

PrivateDeclareFunctionSetClipboardDataLib"user32"(ByValwFormatAsLong,ByValhMemAsLong)AsLong

(24)EmptyClipboard函数清空剪贴板

PrivateDeclareFunctionEmptyClipboardLib"user32"()AsLong

(25)DeleteObject函数删除GDI对象,比如画笔、刷子、字体、位图、区域以与调色板等等。

对象使用的所有系统资源都会被释放

PrivateDeclareFunctionDeleteObjectLib"gdi32"(ByValhObjectAsLong)AsLong

本系统中还使用了其他一些API函数,读者可以参考相关的资料。

3.常用图像处理原理

本系统实现了很多的图像处理的功能,但是每种图像处理都有一定的理论基础,下面介绍一些常用的图像处理的原理。

(1)图像的灰度处理

图像由彩色转化为灰度的过程叫做灰度化,由于位图为点阵图像,它的每一个像素点有R、G、B三个分量组成,R、G、B的变化可以产生1600多万种颜色,Delphi中灰度化有几种方法可以实现:

方法一:

求出每一个像素点的R、G、B的平均值,然后把这个平均值赋给该像素点的R、G、B三个分量。

方法二:

求出每一个像素点R、G、B三个分量的最大值,然后把这个最大值赋给原来像素点的R、G、B三个分量。

方法三:

根据YUV的颜色空间,Y分量的物理含义就是亮度,它含了灰度图的所有信息,只用Y分量就完全能够表示出一幅灰度图来。

YUV和RGB之间有着如下的对应

关系:

利用上式,可以求出:

Y=0.299R+0587G+0.114B

根据R,G,B的值求出Y值后,将R,G,B值都赋值成Y,就能表示出灰度图来,这就是24位真彩色图转灰度图的原理。

(2)图像的二值化

图像的二值化的具体办法是:

通过设定阈值(Threshold),把灰度图像变换成仅用两个值(0或1)来分别表示的图像目标和图像背景的二值图像,其中目标取值为1,背景值取值为0。

实际的位图(Bitmap)中,0对应于 RGB值均为0,1对应于RGB值均为255,二值化图像的方法很多,阈值的选择是二值化图像的关键。

阈值的选择主要可以分为两类:

全局阈值和局部阈值。

全局阈值是对整个图像采用一个阈值进行划分,例如固定阈值法二值化、判断分析法二值化、基于灰度差直方图的阈值法等。

不同的灰度图像,其灰度深度是存在差异的。

同一幅灰度图像,不同部位其明暗分布可能是不同的。

因此,在对灰度图像进行二值化的过程中,如果选用全局阈值法显然是不合适的。

局部阈值是将图像分成一些子块,对于每一子块选定一个阈值。

其中动态阈值法是一个变换方法,即在一个n×n的子块中,所有具有灰度级超过平均灰度值到255数据点变换1(即黑色),而另一些低于平均灰度值的数据点则变换到1(即白色)。

具体作法如下:

图像分为n×n的方块,对每一个子块计算其平均灰度值,然后将方块中每个像素点的灰度值与平均灰度值进行比较,若大于平均灰度值,则将该像素点灰度值置为255;反之则置为0。

一般采用8×8的分块大小的动态阈值二值化方法能取得的效果最佳。

(3)图像对比度

图像对比度是指图像上两点问信号的差异。

在一幅灰阶图像上,信号的差异是通过灰度(或亮度)的明暗来体现的,高对比度意思是图像上两个不同观察点一个非常暗,另一个非常亮,而低对比度表示两点的相对亮度差别

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

当前位置:首页 > PPT模板 > 商务科技

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2