VC图像处理Word文档下载推荐.docx
- 文档编号:21666842
- 上传时间:2023-01-31
- 格式:DOCX
- 页数:10
- 大小:25.93KB
VC图像处理Word文档下载推荐.docx
《VC图像处理Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《VC图像处理Word文档下载推荐.docx(10页珍藏版)》请在冰豆网上搜索。
腐蚀、膨胀、细化、距离变换等;
9.图像分析:
直线、圆、特定物体的识别;
10.JEPG、GIF、PCX等格式文件相关操作;
11.图像文件格式的转换;
12.图像的常用变换:
付利叶变换、DCT变换、沃尔什变换等;
13.AVI视频流的操作;
图像处理技术博大精深,不仅需要有很强的数学功底,还需要熟练掌握一门计算机语言,在当前流行的语言中,我个人觉的VisualC++这个开发平台是图像开发人员的首选工具。
本讲座只是起到抛砖引玉的作用,希望和广大读者共同交流。
第一节图像的文件格式
要利用计算机对数字化图像进行处理,首先要对图像的文件格式要有清楚的认识,因为我们前面说过,自然界的图像以模拟信号的形式存在,在用计算机进行处理以前,首先要数字化,比如摄像头(CCD)摄取的信号在送往计算机处理前,一般情况下要经过数模转换,这个任务常常由图像采集卡完成,它的输出一般为裸图的形式;
如果用户想要生成目标图像文件,必须根据文件的格式做相应的处理。
随着科技的发展,数码像机、数码摄像机已经进入寻常百姓家,我们可以利用这些设备作为图像处理系统的输入设备来为后续的图像处理提供信息源。
无论是什么设备,它总是提供按一定的图像文件格式来提供信息,比较常用的有BMP格式、JPEG格式、GIF格式等等,所以我们在进行图像处理以前,首先要对图像的格式要有清晰的认识,只有在此基础上才可以进行进一步的开发处理。
在讲述图像文件格式前,先对图像作一个简单的分类。
除了最简单的图像外,所有的图像都有颜色,而单色图像则是带有颜色的图像中比较简单的格式,它一般由黑色区域和白色区域组成,可以用一个比特表示一个像素,“1”表示黑色,“0”表示白色,当然也可以倒过来表示,这种图像称之为二值图像。
我们也可以用8个比特(一个字节)表示一个像素,相当于把黑和白等分为256个级别,“0”表示为黑,“255”表示为白,该字节的数值表示相应像素值的灰度值或亮度值,数值越接近“0”,对应像素点越黑,相反,则对应像素点越白,此种图像我们一般称之为灰度图像。
单色图像和灰度图像又统称为黑白图像,与之对应存在着彩色图像,这种图像要复杂一些,表示图像时,常用的图像彩色模式有RGB模式、CMYK模式和HIS模式,一般情况下我们只使用RGB模式,R对应红色,G对应绿色,B对应蓝色,它们统称为三基色,这三中色彩的不同搭配,就可以搭配成各种现实中的色彩,此时彩色图像的每一个像素都需要3个样本组成的一组数据表示,其中每个样本用于表示该像素的一个基本颜色。
对于现存的所有的图像文件格式,我们在这里主要介绍BMP图像文件格式,并且文件里的图像数据是未压缩的,因为图像的数字化处理主要是对图像中的各个像素进行相应的处理,而未压缩的BMP图像中的像素数值正好与实际要处理的数字图像相对应,这种格式的文件最合适我们对之进行数字化处理。
请读者记住,压缩过的图像是无法直接进行数字化处理的,如JPEG、GIF等格式的文件,此时首先要对图像文件解压缩,这就要涉及到一些比较复杂的压缩算法。
后续章节中我们将针对特殊的文件格式如何转换为BMP格式的文件问题作专门的论述,经过转换,我们就可以利用得到的未压缩的BMP文件格式进行后续处理。
对于JPEG、GIF等格式,由于涉及到压缩算法,这要求读者掌握一定的信息论方面的知识,如果展开的话,可以写一本书,限于篇幅原因,我们只作一般性的讲解,有兴趣的朋友可以参考相关书籍资料。
BMP图像的基本操作
上一讲我们主要介绍了图像的格式,其中重点说明了BMP文件的存储格式,同时对JEPG和GIF等常用格式作了简单的介绍。
本节主要讲述如何操作BMP文件,如对其读、写和显示等。
在实现数字图象处理的过程中,主要是通过对图像中的每一个像素点运用各种图像处理算法来达到预期的效果,所以进行图像处理的第一步,也是我们最关心的问题,是如何得到图像中每一个像素点的亮度值;
为了观察和验证处理的图像效果,另一个需要解决的问题是如何将处理前后的图像正确的显示出来。
我们这章内容就是解决这些问题。
随着科技的发展,图像处理技术已经渗透到人类生活的各个领域并得到越来越多的应用,但是突出的一个矛盾是图像的格式也是越来越多,目前图像处理所涉及的主要的图像格式就有很多种,如TIF、JEMP、BMP等等,一般情况下,为了处理简单方便,进行数字图像处理所采用的都是BMP格式的图像文件(有时也称为DIB格式的图像文件),并且这种格式的文件是没有压缩的。
我们通过操作这种格式的文件,可以获取正确显示图像所需的调色板信息,图像的尺寸信息,图像中各个像素点的亮度信息等等,有了这些数据,开发人员就可以对图像施加各种处理算法,进行相应的处理。
如果特殊情况下需要处理其它某种格式的图像,如GIF、JEMP等格式的图象文件,可以首先将该格式转换为BMP格式,然后再进行相应的处理。
这一点需要读者清楚。
BMP格式的图像文件又可以分为许多种类,如真彩色位图、256色位图,采用RLE(游程编码)压缩格式的BMP位图等等。
由于在实际的工程应用和图像算法效果验证中经常要处理的是256级并且是没有压缩的BMP灰度图像,例如通过黑白采集卡采集得到的图像就是这种格式,所以我们在整个讲座中范例所处理的文件格式都是BMP灰度图像。
如果读者对这种格式的位图能够作到熟练的操作,那么对于其余形式的BMP位图的操作也不会很困难。
BMP灰度图像作为Windows环境下主要的图像格式之一,以其格式简单,适应性强而倍受欢迎。
正如我们在上一讲中介绍过的那样,这种文件格式就是每一个像素用8bit表示,显示出来的图像是黑白效果,最黑的像素的灰度(也叫作亮度)值为“0”,最白的像素的灰度值为“255”,整个图像各个像素的灰度值随机的分布在“0”到“255”的区间中,越黑的像素,其灰度值越接近于“0”,越白(既越亮)的像素,其灰度值越接近于“255”;
与此对应的是在该文件类型中的颜色表项的各个RGB分量值是相等的,并且颜色表项的数目是256个。
在进行图像处理时,操作图像中的像素值就要得到图像阵列;
经过处理后的图像的像素值需要存储起来;
显示图像时要正确实现调色板、得到位图的尺寸信息等。
结合这些问题,下面我们针对性的给出了操作灰度BMP图像时的部分函数实现代码及注释。
BMP图像显示的特效操作
上期讲座中我们主要讲述了BMP图像数据的存取、图像的显示和调色板的操作等内容,在上面的学习基础上,我们可以进一步深化,学习并掌握图像特效显示技术。
有了这种技术,可以用来在今后的项目开发中美化我们的软件界面,提高软件的视觉效果。
在如今的商业软件中,几乎每一幅图像的显示都采用了图像特效显示,例如读者比较熟悉的Windows的屏幕保护程序就采用了各种各样的图像特效显示,使人感到眼花缭乱和耳目一新。
专业图像处理软件更是提供了丰富的显示方式供用户使用,可以方便的在程序中实现图像的特效显示,如PhotoShop、Authorware等。
本节主要介绍如何实现图像的浮雕、雕刻、百页窗、旋转、扫描、栅条、马赛克、和渐显渐隐显示等效果。
通过这期讲座的学习,读者朋友们也可以自己动手制作拥有特效显示效果的软件了。
图像的显示我们讲过主要有BitBlt()、SetDIBitsToDevice()和StretchDIBits()等函数。
需要读者注意的是,在特效显示时,并不是每个显示函数都适宜,BitBlt()函数主要是用来显示设备无关位图(DDB),后两个函数用来显示设备无关位图(DIB)。
由于我们讲座里处理的是设备无关位图,所以我们主要关心的是后两个函数的应用,其中SetDIBitsToDevice()使用起来较死板,远不如StretchDIBits()用的灵活,并且对大多数的特效显示无能为力,所以为了实现图像的特效显示效果,需要使用StretchDIBits()函数来显示图像,具体什么原因,我想可能是微软在实现这些函数时使用的方法不同吧。
这些函数如何使用,各个参数的含义,可以参考微软的MSDN。
实现图像的特殊效果的显示的基本思路是要么是操作图像的像素,要么是对图像分块按一定的方向或次序,分阶段的显示或擦除对应的图像块。
对于第二种显示的思路,其中的要点是:
1.划分图像块;
2.确定图像块的操作次序;
3.显示或清除对应的图像块;
4.在两个连续显示的图像块之间插入一个固定的延迟。
其中图像块的划分决定了图像的显示方式,图像块的显示顺序决定了显示的方向和细分的依据。
不同的效果决定了不同的分块方法和显示次序,我们将在后面的各种特效显示中介绍如何分块和决定次序。
为了使图像的显示过程明显的表现出来,实现显示的特效,就需要在图像块的依此显示中插入固定的延迟。
也许读者朋友会想到利用sleep()函数或用Settime()来实现延迟,由于Windows是个基于消息的多任务操作系统,这些方法所产生的延迟时间对于图像的显示来说是不精确的,为了实现与机器无关的更精确的时间延迟,可以采用timeGetTime()函数来产生微秒级的延迟。
使用这个函数时为了编译不产生错误,要在连接设置中引入“Winmm.lib”库,并要包含头文件“Mmsystem.h”。
这里我们首先给出一个延迟函数,它用来实现固定时间的延迟:
voidDelayTime(DWORDtime)
{
DWORDBeginTime,EndTime;
BeginTime=timeGetTime();
//得到当前的系统时间、单位为微秒;
do
EndTime=TimeGetTime();
//再次得到当前的系统时间;
}
while((EndTime-BeginTime)<
time)//判断延迟时间是否已经结束;
一、操作位图的像素实现显示的特效
我们首先介绍直接操作图像中的像素的灰度值来实现图像显示的特效、这里我们主要介绍如何实现图像的浮雕和雕刻效果。
经常看电视的朋友们不知注意到没有,有些电视连续剧在每集片头或片尾部分都有显示一些特殊效果的图像,比如前一阵子中央一套放的《长征》和《康熙王朝》,这些特效称为"
图像的浮雕效果"
和"
图像的雕刻效果"
,经过这些特效处理后的图像增强了观众们的视觉效果,它们看上去仿佛是使用3D技术作的,这也许就是为什么这种技术那么流行的原因吧。
其实,我们完全可以用一些简单的数字图像处理算法来实现这些看似复杂高深的显示效果。
下面以一个标准的Lena灰度图像为原图,给出了处理后的效果图,同时给出了VC开发平台上的部分实现源代码。
1."
浮雕"
图像
"
图象效果是指图像的前景前向凸出背景。
所谓的"
概念是指标绘图像上的一个像素和它左上方的那个像素之间差值的一种处理过程,为了使图像保持一定的亮度并呈现灰色,我在处理过程中为这个差值加了一个数值为128的常量。
需要读者注意的是,当设置一个像素值的时候,它和它左上方的像素都要被用到,为了避免用到已经设置过的像素,应该从图像的右下方的像素开始处理,下面是实现的源代码:
voidCDibView:
:
OnFDImage()//产生"
效果图函数
HANDLEdata1handle;
//用来存放图像数据的句柄;
LPBITMAPINFOHEADERlpBi;
//图像的信息头结构;
CDibDoc*pDoc=GetDocument();
//得到文挡指针;
HDIBhdib;
unsignedchar*pData;
//指向原始图像数据的指针;
unsignedchar*data;
//指向处理后图像数据的指针;
hdib=pDoc->
m_hDIB;
//拷贝存放已经读取的图像文件数据句柄;
lpBi=(LPBITMAPINFOHEADER)GlobalLock((HGLOBAL)hdib);
//获取图像信息头
pData=(unsignedchar*)FindDIBBits((LPSTR)lpBi);
//FindDIBBits是我定义的一个函数、根据图像的结构得到位图的灰度值数据、
pDoc->
SetModifiedFlag(TRUE);
//设置文档修改标志为“真”、为后续的修改存盘作准备;
data1handle=GlobalAlloc(GMEM_SHARE,WIDTHBYTES(lpBi->
biWidth*8)*lpBi->
biHeight);
//声明一个缓冲区用来暂存处理后的图像数据;
data=(unsignedchar*)GlobalLock((HGLOBAL)data1handle);
//得到该缓冲区的指针;
AfxGetApp()->
BeginWaitCursor();
inti,j,buf;
for(i=lpBi->
biHeight;
i>
=2;
i--)//从图像右下角开始对图像的各个像素进行“浮雕”处理;
for(j=lpBi->
biWidth;
j>
j--)
{
//浮雕处理
buf=*(pData+(lpBi->
biHeight-i)*WIDTHBYTES(lpBi->
biWidth*8)+j)-*(pData+(lpBi->
biHeight-i+1)*WIDTHBYTES(lpBi->
biWidth*8)+j-1)+128;
if(buf>
255)buf=255;
if(buf<
0)buf=0;
*(data+(lpBi->
biWidth*8)+j)=(BYTE)buf;
for(j=0;
jbiHeight;
j++)
for(i=0;
ibiWidth;
i++)
//重新写回原始图像的数据缓冲区;
*(pData+i*WIDTHBYTES(lpBi->
biWidth*8)+j)=*(data+i*WIDTHBYTES(lpBi->
biWidth*8)+j);
AfxGetApp()->
EndWaitCursor();
m_hDIB=hdib//将处理过的图像数据写回pDoc中的图像缓冲区;
GlobalUnlock((HGLOBAL)hdib);
//解锁、释放缓冲区;
GlobalUnlock((HGLOBAL)data1handle);
GlobalFree((HGLOBAL)hdib);
GlobalFree((HGLOBAL)data1handle);
Invalidate(TRUE);
//显示图像
BMP图像操作的补充篇
上一讲中我们介绍了图像特效显示操作的实现方法,如随机显示效果、马赛克效果、拉幕显示效果等,由于篇幅的限制,还有许多效果没有介绍;
本期讲座将接着上一讲的内容,继续介绍一些图像特效显示效果。
另外,我们前面的学习都是针对现成的BMP图像,在实际工作学习中,绝大部分处理图像过程都是在一个系统环境中,也就是说需要和图像数据的获取设备直接打交道,一般情况下,计算机图像处理系统从系统层次上可分为高、中、低档三个层次,目前比较普及的是低档次的系统,该系统由CCD(摄像头)、图像采集卡、计算机三个部分组成,其结构简单,应用方便,效果也比较不错,得到的图像较清晰,所以目前在工程应用中采用的比较多。
这就给开发人员带来一个现实的问题,如何使用图像采集卡呢?
目前虽然各种编程资源中基于VC开发经验的文章不少,但是关于如何在VC开发平台上使用图像采集卡的文章的确没发现,笔者借这期讲座的宝贵机会,补充介绍一下如何在程序中编写自己的代码来操作图像采集卡,从而搭建一个完整的图像处理系统。
希望通过这部分内容的学习,在读者的脑海里就可以建立一个完整的图像操作系统概念;
同时也能够给目前正需要利用图像采集卡开发自己的图像处理系统的朋友有所帮助。
1.抖动图像
在上一节讲座中,我们讲到了如何实现图象的"
雕刻"
效果,它们的实现思想是通过求取"
没有处理过的相邻两个像素之间的差值"
来实现的。
如果没有限制"
以前没有处理过的两个像素之间的操作"
,取而代之的是"
处理以前已经操作过的像素"
,那末就可以将一个像素的灰度值传递到与其相邻的若干像素。
事实上,有时后我们必须通过上述的约定才能实现一些效果,如图像的抖动效果。
例如,为了使图象看起来好象从左上角向右下角扫过,以产生运动的感觉,必须要反复拷贝左上方的那些像素的灰度值,逐步把它们融合在一起,看起来好象图像后边有一些颜色在逐渐的消失,这就是我们要讲的图象的抖动效果。
下面给出了该效果的实现代码:
OnDouDongImage()//产生"
抖动"
//获取图像信息头;
//FindDIBBits是我定义的一个函数,根据图像的结构得到位图的灰度值数据;
//设置文档修改标志为"
真"
,为后续的修改存盘作准备;
i--)//从图像右下角开始对图像的各个像素进行"
处理;
//抖动处理、从图像的右下角开始计算图像斜上方相邻像素的均值;
buf=(*(pData+(lpBi->
biWidth*8)+j)+*(pData+(lpBi->
biWidth*8)+j-1))/2;
//限制像素点的灰度范围为0-255;
j<
i<
AfxGetApp()->
} 对于比较复杂的图像,计算当前像素的灰度和斜上方像素的均值产生的抖动效果可能不明显,为了解决这个问题,笔者的解决办法是隔行隔列的计算,比如说计算当前位置(ij)的灰度值,我取(i,j)和(i-2,j-2)两个位置的像素的灰度值的平均。
2.图像合成技术
图像合成技术很重要,其实质是操作将两幅或两幅以上的图像,将它们的信息融合在一起,产生1+1>
2的效果。
我们在进行图像合成的时候可以采用Alpha值的方法,下面来看一下如何利用Alpha值来合成两张图片。
采用Alpha图象合成的方法,就是最终合成的图象的各点像素值是由用来制作合成图的两张图片的相应点的像素值按一定比例混合而成的,这个比例由Alpha值决定,具体算式如下:
resultPixe=(pixel1*(255-Alpha)+pixel2*Alpha)/255;
//Alpha取值范围从0到255 上面的算式中,pixel1代表图像1的当前像素点的灰度值,pixel2代表图像2的当前像素点的灰度值,Alpha可以看作两个像素在最终合成的结果中所占的权重。
可以看出,只要修改Alpha的值,就可以改变合成后的图象中用来合成的两张图片各自所占的比值,改变合成后的显示效果。
我们可以利用这个方法
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- VC 图像 处理