资源描述
. . . .
Delphi实现计算机视觉常用图像处理算法
摘 要:由于图像处理涉与到了大量的程序编制工作,因此,如何合理选择一种简洁高效的编程工具,减少研究工作中的复杂性,就成为了计算机数字图像处理中不可回避的问题。本文就利用Delphi实现对计算机视觉中常用图像处理方法。
关键词:计算机视觉;数字图像处理;Delphi
The Algorithms for Image Processing ofComputerVision Implemented in Delphi
Abstract:Image processing involves lots ofprogramming. Hence how to select a programming toolwith simplicity andhigh efficiency became an unavoidable problem in computer-based digital image processing. For reference, this articleimplemented the image processing algorithms in common usewith Delph.i
Key words:computer vision; digital image processing; Delphi
1 引 言
计算机视觉[1]是采用各种成象系统代替视觉器官作为输入手段,并通过计算机技术来完成替代大脑完成处理和解释任务的一门学科,其最终研究目标就是使计算机能象人那样通过视觉观察和理解世界,具有自主适应环境的能力。在计算机视觉的发展过程中,图像处理、模式识别、图像理解这一系列相关学科的发展对其有着至关重要的推动作用。本文中,就将如何利用Delphi开发工具对计算机视觉中应用较多的一些数字图像处理方法进行实现进行详细讨论。
1 Delphi实现技术
在Delphi中,专门定义了一组对象和部件用以绘制图形[2],完成一些简单的图像功能。利用这些对象、部件的方法,可以方便地绘制各种常用图形;通过设置它们的属性,能得到不同风格的图形。另外,通过对鼠标事件的定义,可以方便地设计图形绘制程序。
Delphi中的各图像编程对象见图1。
图1 Delphi图像编程对象图
与其他的按照像素对位图进行操作的编程工具不同的是, Delphi中提供了ScanLine函数[3],使得在Delphi中处理位图,可以行作为处理单位,加快处理的速度,简化处理的操作,函数声明和具体操作方法如下:
Property ScanLine[Row: Integer]:Pointer;其中Row为位图图像的行号,返回的是一个指向
位图像素数据的指针,换言之,在程序编制时,只需要简单的调用ScanLine[n],就可以获取第n行的所有像素点的颜色值,编程简洁高效。
程序界面与需处理图像如2所示。
图2 程序界面图
2 常用处理实现
2. 1 图像灰度处理实现
将彩色图像转化为灰度图像的过程称为图像的灰度化处理[4]。彩色图像中的每个象素的颜色由R、G、B三个分量决定,而每个分量有255种值可取,每个像素点可表示的色彩数目为255×255×255 =16581375,约1400万种颜色。灰度图像是R、G、B三个分量一样的一种特殊的彩色图像,每个像素点可表示的色彩数目仅为255种。在数字图像处理中,大部分情况下特别是图像识别中首先进行的操作即将图像灰度化,降低图像处理的复杂度。
图像的灰度化处理可用下列两种方法实现:
(1)求出每个像素点的R、G、B三个分量的平均值,然后将这个平均值赋值给这个象素颜色的三个分量。
(2)根据YUV颜色空间中的Y分量意义转换。YUV颜色空间中,Y的分量代表点的亮度,由公式Y=0. 3×R+0. 59×G+0. 11×B可换算出Y值用以表示图像的灰度值。
实现效果如图3所示。
图3 灰度处理效果图
2. 2 图像二值化实现
在计算机视觉处理中,图像的二值化操作[4]是其中极其重要的一个基本操作,大量的数字图像处理工作都是基于二值化的结果来进行的。二值化其0、1两种表示的简单性,使得图像的处理工作变得十分简单高效。进行二值化操作,一般是将图形灰度化处理,之后对灰度图进行二值化操作。图像二值化的具体方法是:通过设定阈值(Threshold),把灰度图像变化成仅用两个值(0或1),公式如下:
g(x,y) =1f(x,y)≤T
0f(x,y) >T
T为阈值
二值化操作中的关键在于阈值的选择。阈值的选择主要分为两类:全局阈值和局部阈值。全局阈值是对整个图形采用一个阈值进行划分。局部阈值是将图形分为一些子块,对于每一子块选定一个阈值。
实现效果如图4所示。
图4 图像二值化效果图
2. 3 图像中值滤波去噪
在计算机视觉的图像识别中,由于图像中不可避免地会存在一定的噪声污染,在图形识别前,必须对图像进行一定的图像增强操作。中值滤波[4]作为其中的解决方法之一,在某些条件下可以做到既去除噪声又保护了图像边缘的较满意的复原效果,在图像识别中也有较为广泛的应用。中值滤波的基本原理是,把图像或数字序列中的一点的值用该点的一个邻域中各点值的中值代替。(中值是中间位置的值,而不是平均值。)其定义为:
一组数x1≤x2≤……≤xn,把n个数按值的大小
顺序排列如下
y =Med(x1,x2,…,xn) =
x1(n +12) n为奇数
2[xi(n2) +xi(n2+1)] n为偶数时
y称为序列x1≤x2≤…≤xn的中值。例如有一序列为{80,90,200,110,120},这个序列的中值为110。把一个点的特定长度或形状的邻域称作窗口。在一维情形下,中值滤波器是一个含有奇数个象素的滑动窗口。窗口正中间那个象素的值用窗口各象素值的中值代替。
设输入序列为{xi, i∈I}I为自然数集合或子集,窗口长度为n。则滤波器输出为:
yi=Med{xi} =Med{xi-u……xi……xi+u}
其中i∈I,u=(n-1) /2。
实现效果如图5所示。
图5 中值滤波效果图
2. 4 图像边缘检测演示
在计算机视觉中的图像分割操作中,边缘的获取是基于边界的图像分割方法的第一步,也是描述图像区域最重要的特征之一。要进行边缘的获取,就要进行边缘检测工作,为图像分割、纹理特征和形状特征抽取提供分析依据。由于边缘检测在其中所起到的基础作用十分明显,因此它已经成为目前计算机视觉研究领域中最活跃的课题之一。
图像中的边缘通常与图像强度或图像强度的一阶导数的不连续性有关[7].图像强度的不连续可分为:(1)阶跃不连续,即图像强度在不连续处的两边的像素灰度值有着显著的差异; (2)线条不连续,即图像强度突然从一个值变化到另一个值,保持一个较小的行程后又返回到原来的值。对这种阶跃不连续和线条不连续的结果,可利用求导方式进行检测,目前常用的技术是利用梯度算子和拉普拉斯算子[5]进行求取,这里主要介绍梯度算子的实现。
一阶导数 f x和 f y是最简单的导数算子,分别表示灰度在x和y方向上的变化率,而在方向r上的灰度变化率可以表示为:
f
r= f xcosθ+ f ysinθ
对于数字图像一般采用差分运算代替求导,相对
应的一阶差分为:
Δxf(i,j) =f(i,j) -f(i-1,j)
Δyf(i,j) =f(i,j) -f(i,j-1)
方向差分为:
Δrf(i,j) =Δxf(i,j)cosθ+Δyf(i,j)sinθ
方向导数的最大值|G|=( f x)2+( f y)2称为梯度模,实际中可利用梯度模算子来检测边缘具有位移不变性,常用的梯度算子有Roberts, Prewit,t Sobe,lIsotropic Sobel等。
实现效果如图6所示。
图6 边缘检测效果图
3 结 语
从以上Delphi对图像处理中涉与到各个算法的实现可以看出, Delphi除了在数据库编程、window编程等方面拥有很强的优势外,在图像处理上也有着非常强大的功能,Delphi在图像处理上的速度并不亚于VC,但在开发效率上远远超过VC。在整个算法的实现过程中,Delphi的实现代码十分精简高效,特别是在充分利用Delphi图像编程对象和ScanLine方法后,整个程序仅需要少量代码就可以完成一个算法的实现过程。同时,由于Delphi本身在程序开发上的传统优势,使得Delphi实现的程序比起Matlab等其他工具实现的程序来说,更具有广泛的适用性,是研究人员在计算机视觉研究中值得选择的一个开发工具。
基于C#的三种数字图像处理方法
摘 要:为更快速地进行图像算法的开发,介绍了三种基于C#语言的图像处理方法:直接提取像素法、存法和指针法.通过对彩色图像进行灰度化这一简单的数字图像处理算法实验,比较了这三种方法的特点.
关键词:图像处理;C#;像素;存;指针
在过去的二三十年间,C/C++已经成为在商业软件的开发领域中使用最广泛的语言.但它在给程序员带来灵活性的同时,也牺牲了开发效率.用C/C++开发应用程序往往需要更长时间,用C/C++编写数字图像处理算法尤其如此,对于初学者来说,既要精通图像处理算法,又要熟练掌握这种语言的语法结构,似乎是一件很难的事情.
C#是一种新的面向对象的编程语言,它使程序员可以快速地开发出基于Microsof.t NET平台的应用程序.更重要的是,它没有损失C/C++原有的强大功能,继承了C/C++的灵活性.[3]应用C#语言,通过对彩色图像的灰度化这一简单的图像处理算法,较详细地介绍3种基于C#的方法,并比较了它们的特点.
1 三种数字图像处理方法
下面通过把彩色图像灰度化来详细介绍图像处理的三种方法.灰度化的算法是先读取彩色图像中每个像素的颜色值,然后通过下面的公式得到灰度值:P =R×0.299+G×0.587+B×0.114,式中P为最终的灰度值,R、G和B分别为该像素中的红色、绿色和蓝色分量值.最后再把该灰度值P分别赋予R、G和B.
1.1 直接提取像素法 它是利用下一代的图形设备接口———GDI+中的Bitmap GetPixel和Bitmap
SetPixel方法.[4]235GetPixel和SetPixel方法是分别获取和设置一个图像的指定像素的颜色.
下面代码具体是如何用该方法进行灰度化,它通过两重循环逐个像素点进行处理:
( //创建一个Bitmap对象)
BitmapmyBitmap = new Bitmap (“lenna. bmp”);
( //使用GetPixel和SetPixel将所有像素都设置为灰度)
for ( int i = 0; i <myBitmap.W idth; i ++ )
{
for ( int j = 0; j <myBitmap.Heigh;t j ++)
{
ColormyColor =myBitmap.GetPixel ( ,i j );
int ret= ( int) ( myColor.R* 0. 299 +myColor.G* 0. 587 +myColor.B* 0. 114 );
myBitmap. SetPixel ( ,i ,j Color.FromArgb ( re,t re,t ret) );
}
}
1.2 存法 存法和下面介绍的指针法都使用了Bitmap类提供的LockBits和UnlockBits方法,它们的作用是分别锁定和解锁系统存中的位图像素.在基于像素点的图像处理方法中使用LockBits和UnlockBits是一个很好的方式,这两种方法可以通过指定像素的围来控制位图的任意一部分,从而消除了通过循环对位图的像素逐个进行处理的需要.每次调用LockBits之后都应该调用一次UnlockBits.存法还用到了MarshalCopy方法,它可以将数据从托管数组复制到非托管存指针,或从非托管存指针复制到托管数组.
下列代码具体是用该方法进行的灰度化:
BitmapmyBitmap = new Bitmap (“lenna. bmp”);
( //锁定位图像素)
Rectangle rect= new Rectangle ( 0, 0, myBitmap.W idth, myBitmap.Height);
System.Drawing. Imaging.BitmapData bmpData =myBitmap.LockBits ( rec,t
System.Drawing. Imaging. ImageLockMode.ReadWrite, myBitmap.PixelFormat);
System. IntPtr ptr = bmpData. Scan0;
( //定义位图数组)
intbytes =myBitmap.W idth* myBitmap.Height* 3;
byte [ ] rgbValues = new byte [ bytes ];
System.Runtime. InteropServices.Marsha.l Copy ( pr,t rgbValues, 0, bytes);
double colorTemp = 0;
for ( int counter = 0; counter < rgbValues.Length; counter += 3)
{
colorTemp = rgbValues [ counter + 2 ]* 0. 299 + rgbValues [ counter + 1 ]* 0. 587 +
rgbValues [ counter ]* 0. 114;
rgbValues [ counter ] = rgbValues[counter+1]=rgbValues [counter+2]=colorTemp;
}
( //把像素值复制回位图)
System.Runtime. InteropServices.Marsha.l Copy ( rgbValues, 0, ptr, bytes );
myBitmap.UnlockBits ( bmpData );
1.3 指针法 该方法与存法相似,开始都是通过LockBits方法来获取到位图的首地址,但该方法更简洁,直接应用指针对位图进行操作.为了保持类型安全,默认情况下,C#是不支持指针运算的,因为使用指针会带来相关的风险,所以C#只允许在特别标记的代码块中使用指针,通过使用unsafe关键字,可以定义
可使用指针的不安全上下文
下列代码具体是用该方法进行的灰度化:
BitmapmyBitmap = new Bitmap (“lenna. bmp”);
Rectangle rect= new Rectangle ( 0, 0, myBitmap.W idth, myBitmap.Height);
System.Drawing. Imaging.BitmapData bmpData =myBitmap.LockBits ( rec,t
System.Drawing. Imaging. ImageLockMode.ReadWrite, myBitmap.PixelFormat);
System. IntPtr ptr = bmpData. Scan0;
intbitmapLength =myBitmap.W idth* myBitmap.Heigh;t
( //应用指针对位图进行灰度化)
unsafe
{
byte* pix = ( byte* ) ( void* ) pr;t
byte temp = 0;
for ( int i = 0; i < bitmapLength; ++i )
{
temp = ( byte ) ( 0. 299* pix [ 2 ] + 0. 587* pix [ 1 ] + 0. 114* pix [ 0 ]);
pix [ 0 ] = pix [ 1 ] = pix [ 2 ] = temp;
pix += 3; }
}
myBitmap.UnlockBits ( bmpData );
使用该方法要注意的是,因为在默认情况下,C#不支持指针运算,所以要想成功地编译上述语句,就得在编译器选项中把“允许不安全代码”的复选框选上方可.
2 3种方法的比较
数字图像处理实际上涉与到的是二维矩阵的运算,它是一个很耗时的运算过程.因此如何提高它的效率就成为图像处理算法的关键,所以在这里主要比较3种算法的运行时间.通过对512×512的BMP彩色图像[6]进行灰度化来测试3种方法运行的时间.其中只对核心算法进
行计时.运行环境是硬件配置为CPU:AMD Athlon 4400+;存:DDRII-800, 1G;软件配置为MicrosoftW indowsXP SP2:VisualStudio 2005.直接提取像素法平均运行时间为729ms;存法平均运行时间为11ms;指针法平均运行时间为8ms.明显看出,存法和指针法比直接提取像素法要快得多.直接提取像素法应用GDI+中的方法,易于理解,方法简单,很适合于初学者使用,但它的运行速度最慢.存法是把图像复制到存中,直接对存中的数据进行处理,速度明显提高,程序难度也不大.指针法因为直接应用指针来对图像进行处理,所以速度最快.但在C#中,是不建议使用指针,因为使用指针,代码不仅难以编写和调试,而且无法通过CLR的存类型安全检查.只有对C#和指针有充分理解,才能用好该方法.究竟要使用哪种方法,还要看具体情况而决定,但三种方法都能有效地对图像进行处理.
3 总 结
C#是专用于.NET平台的一种新型编程语言,不仅功能强大,而且用法灵活,利用它几乎可以开发出运行在W indows上的所有桌面应用程序和网络应用程序.总结了基于C#语言的三种图像处理方法:直接提取像素法、存法和指针法.直接提取像素法简单易懂,但运行时间最慢;指针法运行时间最快,但不易掌握;存法介于两者之间.通过举一反三,可以应用上述三种方法中的任意一种,开发出其他更复杂的数字图像处理算法来.
基于Delphi的小型图像处理系统设计
[摘要]使用Delphi软件实现图像的各种数字变换处理并开发出小型图像处理系统,完成图像的获取、存
储、复制、粘贴;并实现图像的几何变换与浮雕、锐化、平滑、反色等各种图像的处理。
[关键词]图像图像处理Delphi
随着计算机的发展,数字图像技术近年来得到极大的重视和长足的发展,出现了许多有关的新理论、新方法、新算法、新手段和新设备,并已在科学研究、工业生产、医疗卫生、教育、娱乐、管理和通信等方面得到了广泛的应用,对推动社会发展改善人们生活水平都起到了重要的作用。本文使用Delphi软件实现图像的各种数字变换处理并开发出小型图像处理系统,完成图像的获取、存储、复制、粘贴;并实现图像的几何变换与浮雕,锐化,平滑,反色等各种图像的处理。
1图像的概念
图像可粗分为两大类:位映像图像和向量图像。基于计算机的位映像图像是对电视图像的数字化,它易于描述真实景物,真实世界中的景物可以用扫描仪生成图像文件并在计算机上显示。而向量图像易于表达艺术家设计的图像。这两者在表达方式上不同。为简单起见,可把位映像图像看成是点矩阵(简称点阵)。在图形学中,把矩阵中的点称为像素(Pixel)。位映像图像根据彩色数分为以下四类:单色图像、具有4-16种彩色的图像、具有32-256色的图像和256色以上的图像。也可把这四类图像称为单色图像、低彩色分辨率图像、中等彩色分辨率图像和高彩色分辨率图像。把单色图像称为是1位图像,这是因为图像中的每一个像素仅需1位信息;把16色图像称为是4位彩色图像,这是因为图像中的每个像素需4位信息;另一种常见的图像是256色图像,也称8位彩色图像。256色图像有照片效果,比较真实。另外一种具有全彩色图片表达能力的图像为24位彩色图像。由于彩色的种类很多,每个像素需24位,使得彩色图像需要的存储空间很大。在图像文件的存储格式中也是以位来存储颜色的。位图图像是以纪录屏幕上图像的每一个黑白或彩色的像素来反映图像。
2小型图像处理系统设计
2.1菜单设计
通过Delphi提供的菜单设计工具Menu Designer可方便的进行菜单设计,同时可以为一个菜单项同时设置加速键和快捷键,小型
图像处理系统菜单设计如图1所示。
图1小型图像处理系统菜单结构
2.2工具栏设计
工具栏上有许多ToolButton工具按钮,这些按钮可以用不同图标表示。利用工具栏可以方便地实现对菜单命令的访问。例如,可以直接实现打开和存储文件等操作。制作菜单栏和工具栏需要使用大量的图标,Delphi在“Borland公用文件”中为用户提供了许多常用的图标,本系统工具栏设计如图1所示。
3图像的几何变换与处理的实现
3.1图像几何变换的设计实现
图像的几何变换是图像处理中的一个重要应用,主要包括图像放大和图像缩小。图像放大的实现原理是对X、Y方向伸缩比进行增加;图像缩小的实现原理是对X、Y方向伸缩比进行减小,本系统设计的图像缩小运行结果如图2所示。
图2(a)图像缩小前图2(b)图像缩小后
3.2图像处理的设计实现
图像处理就是对图像信息进行加工处理,以满足人的视觉心理和实际应用的要求。
3.2.1图像灰度处理
图像由彩色转化为灰度的过程叫做灰度化,由于位图为点阵图像,它的每一个像素点由R、G、B三个分量组成,R、G、B的变化可以产生1600多万种颜色。在Delphi中灰度化有几种方法可以实现,本系统采用求出每一个像素点的R、G、B的平均值,然后把这个平均值赋给该像素点的R、G、B三个分量。系统运行结果如图3所示。
图3图像的灰度处理
3.2.2图像亮度处理
亮度的调整是指对人眼亮度感觉的调整,在RGB颜色空间中一般是R、G、B三个分量同时进行增加或减少进行调节。本系统通过给R、G、B各个分量增加一样的值来实现图像的亮度处理。
3.2.3图像反色处理
对于一幅24位的真彩色位图,它的每一个字节由R、G、B三个分量构成,图像的反色就是对R、G、B三个分量同时进行取反操作,在Delphi图像处理中可以实现24位真彩色图像的反色操作。
3.2.4图像平滑处理
消除图像的噪音与满足彩色复制特殊需要的方法,在图像处理中称为图像平滑,它分为空间域处理和频谱域处理两种,主要有领域平均法、低通滤波法和多图像滤波法等,本系统采用领域平均法。
3.2.5图像锐化处理
图像的锐化是要消除模糊,必须增强图像中频率高的空间频率成分。它是一种使图像具有的信息让人们易于观察图像质量改善的方法,从数学角度上讲就是对图像进行微分化处理。在图像中,边缘是由灰度级和相领域点不同的像素点构成的。因而,若想增强边缘,就应该突出相邻点间的灰度级的变化。微分运算可用来求信号的变化率,因而具有加强高频分量的作用。如果将其应用在图像上,可使图像的轮廓清晰。由于常常无法事先确定轮廓的取向,因而挑选用于轮廓增强的微分算子时,必须选择那些不具备空间方向性的和具有旋转不变的线性微分算子。用这种方法可以去掉引起图像质量劣化的“模糊”,并把图像变得轮廓分明。
3.2.6图像浮雕处理
浮雕效果就是只将图像的变化部分突出来,而一样的颜色部分则被淡化,使图像出现纵深感,从而达到浮雕效果,有灰色浮雕和彩色浮雕两类。接下来我们主要介绍灰色浮雕,它采用的算法是将要处理的像素取值为与处于对角线上的另一个像素间的差值,这样只有颜色变化区才会出现彩色,而颜色平淡区因差值几乎为零则变成黑色,你可以通过加上一个常量来增加一些亮度。
3.2.7中值滤波处理
对受到噪声污染的图像可以采用线性滤波的方法来处理,但是很多线性滤波有低通性,在去除噪声的同时也使得边缘模糊了,中值滤波在某些情况下可以做到即去除噪声又保护图像的边缘,它是一种非线性的去除噪声的方法。
3.2.8图像的二值化
在数字图像处理中,二值图像占有非常重要的地位,特别是在实用的图像处理系统中,以二值图像处理实现构成的系统是很多的,要进行二值图像的处理与分析,首先需要把灰度图像二值化,得到二值图像,这样做的好处是在对图像做进一步处理时,图像的几何性质只与0和1的位置有关,不再涉与到像素的灰度值,使处理变得简单,而且数据的压缩量很大。图像的二值化的具体办法是:通过设定阀值(Threshold),把灰度图像变换成仅有两个值(0或1)来分别表示的图像目标和图像背景的二值图像,其中目标取值为1,背景值取值为0。实际的位图(Bitmap)中,0对应RGB值均为0,1对应于RGB值均为255,二值化图像的方法很多,阀值的选择是二值化图像的关键。阀值的选择主要可分为两类:全局阀值和局部阀值。全局阀值是对整个图像采用一个阀值进行划分,而局部阀值是将图像分成一些子块,对于每一子块选定一个阀值。程序运行结果如图4所示。
图4图像的二值化处理
4结束语
Delphi是一个可视化软件开发工具,没有自带的图像处理的工具箱,但其编程语言具有简单、高效、功能强大的特点,完全具备开发图像处理应用软件的能力。本文使用Delphi软件实现图像的各种数字变换处理并开发出小型图像处理系统,读者可根据实际需要构建所需的功能。
基于VC++的BMP格式图像与GIF格式图像转换
摘 要:探讨了在VC++环境下BMP图像文件与GIF图像文件的转换。首先分析了BMP与GIF 2种图像的具体格式,然后在VC++环境下建立自己的函数库文件DIB.H和DIB. CPP,对即将使用的数据成员和函数成员进行初始化,从而实现BMP图像的读取、显示和保存等相关操作。在理解LZW编码算法原理的基础上,在VC++下实现该算法。同时,通过前面建立的BMP图像函数库,调用相关函数,就可以找到相应的具体的图像数据,进而通过LZW编码将BMP图像数据转换成GIF图像数据,实现图像格式的转换。
关键词:BMP格式分析;图像格式转换; LZW算法
图像是人类获取信息的主要途径。BMP图像文件与GIF图像文件是2种基本的图像文件格式。实现2种格式文件的相互转换符合现实需要,已成为数字图像处理领域中亟待解决的问题,具有很重要的研究价值。目前数字图像处理技术的应用相当广泛,技术也比较成熟。在图像编码方面,常用的有哈夫曼编码、行程编码、LZW编码和JPEG编码。实现BMP与GIF的相互转换,首先必须对BMP与GIF文件的格式进行分析,从而实现两者的读取显示等相关操作,然后要对LZW算法有明确的理解和把握。这样当找到图像数据时,可以利用该算法将BMP文件转化成GIF文件。同时,利用逆变换,也就是解码程序,可以实现GIF转换成BMP。
1 BMP图像格式分析
BMP图形文件是W indows采用的图形文件格式,在W indows环境下运行的所有图像处理软件都支持BMP图像文件格式。W indows系统部各图像绘制操作都是以BMP为基础的。W in-dows 3. 0以前的BMP位图文件格式与显示设备有关,因此把这种BMP图像文件格式称为设备相关位图DDB文件格式。位图文件由4个部分组成:位图文件头、位图信息头、调色板和图像数据。它具有如下所示的形式:
(1) 位图文件头。位图文件头包括文件类型、文件大小和存放位置等信息,在W indows 3. 0以上版本位图文件中用BITMAPFILEHEADER结构来定义:
typedef struct tagBITMAPFILEHEADER
{
UINT bfType; DWORD bfSize; UINT bfRe-
served1;UINT bfReserved2;DWORD bfOffBits;
} BITMAPFILEHEADER;
(2)位图信息头。位图信息头,用BITMAP-INFOHEADER结构定义。BITMAPINFOHEADER结构包含有位图文件的大小、压缩类型和颜色格式,其结构定义如下:
typedef struct tagBITMAPINFOHEADER {
DWORD biSize;
LONG bWi idth;
LONG bHi eigh;t
WORD biPlanes;
WORD biBitCoun;t
DWORD biCompression;
DWORD biSizeImage;
LONG biXPelsPerMeter;
LONG biYPelsPerMeter;
DWORD biClrUsed;
DWORD biClrImportan;t
} BITMAPINFOHEADER;
(3)调色板。调色板元素与位图所具有的颜色数一样,像素的颜色用RGBQUAD结构来定义。对于24位真彩色图像就不使用调色板(也包括16位和32位位图),因为位图中的RGB值就代表了每个像素的颜色。RGBQUAD结构描述由R、G、B相对强度组成的颜色,定义如下:
typedef struct tagRGBQUAD {
BYTE rgbBlue;
BYTE rgbGreen;
BYTE rgbRed;
BYTE rgbReserved;
} RGBQUAD;
(4)位图数据。它是紧跟在调色板后的图像数据字节阵列。图像的每一扫描行由表示图像像素的连续的字节组成,每一行的字节数取决于图像的颜色数目和用像素表示的图像宽度,扫描行是由底向上存储的。这就是说,阵列中的第一个字节表示位图左下角的像素。而最后一个字节表示位图右上角的像素,对于用到调色板的位图,图像数据就是该像素在调色板中的索引值,对于真色彩图,图像数据就是实际的RGB值。同时,每一扫描行的字节数必须是4的整倍数,也就是DWORD对齐的。
2 VC++下实现BMP图像的读取显示
利用VisualC++,实现BMP图像格式读取显示与保存,采用VC++ AppW izard[exe]单文
首先,建立自己的DIB函数库,包括DIB.H和DIB.CPP 2个文件。其次,通过OnOpenDocument( )函数判断打开文件是否成功。如果成功,则判断ReadDIB()函数的DIB返回值是否为空,确定打开的是否为BMP图像文件。如果返回值为空,则不是BMP格式文件,提示“打开文件出错”;如果返回值不为空,则打开的是BMP格式文件,那么程序就可以向下执行。最后,通过OnDraw()消息函数调用DIB函数库中定义的DrawImage()函数。这样就完成了BMP的读取显示操作。具体
流程如图1所示。
3 VC++下LZW编码算法的实现过程
3. 1 LZW的基本原理
LZW编码器使用了一种很实用的分析算法,称为贪婪分析算法(greedy parsing algorithm,
GPA)。在贪婪分析算法中,每一次分析都要串行地检查来自字符流的字符串,从中分析出已经识图1 VC++下实现BMP图像的读取显示流程图别的最长的字符串,也就是已经在词典中出现的最长的前缀。用已知的前缀加上下一个输入字符C,也就是当前字符作为该前缀的扩展字符,形成新的扩展字符串-缀-符串。这个新的缀-符串是否要加到词典中,还要看词典中是否存有与它一样的缀-符串STRING。如果有,那么这个缀-符串就变成前缀,继续输入新的字符;否则就把这个缀-符串写到词典中生成一个新的前缀,并给一个代码。
3. 2 LZW编码算法的实现过程
示意代码如下:
InitializeStringTable(); //初始字串表
WriteCode (LZW _ CLEAR ); //输出LZW _
CLEAR
Ω=NULL; //初始化保留字串Ω
//对输入每个字符循环操作
{
K = GetNextCharacter(); //获取下一个字串
ifΩ+K is in string table //判断Ω+K是否在字串表中
{Ω=Ω+K; //将Ω赋值给Ω+K
}
else
{
WriteCode(CodeFormString(Ω)); //输出字符串Ω的编码
AddTableEntry(Ω);
Ω=K;
}
}
WriteCode(CodeFromString(Ω)); //输出字符串Ω的编码
WriteCode(LZW_EOI); //输出结束标志
4 VC++下BMP转换成G IF的实现
VC++环境下实现BMP向GIF转换,是基于前面的BMP图像的读取显示保存操作和LZW算法分析基础之上的,并同时要求分析GIF文件的具体格式与读写方法。程序是基于VC++下的多文本文档应用程序,具体流程如图2所示。
图2 VC++下BMP转换成GIF的实现流程图
首先建立基本的函数库文件DIB.H、DIB.CPP和GIF.H、GIF.CPP函数库文件,对即将使用的基本的DIB和GIF数据成员和函数成员进行初始化设置,为下一步编程做准备。其次,在掌握LZW算法的基本原理的基础上,在VC++条件下实现该算法,为对具体的图像数据编码做准备。最后,当以上2步工作做好后,找到DIB图像数据,通过编码程序,将DIB图像数据变换成GIF图像数据,同时要根据DIB文件包含的其他图像信息完成GIF文件其他模块的生成。
转换前的BMP图片和转换后的GIF图片如图3所示。
图3 转换前的BMP图片和转换后的GIF图片
5 结 论
首先进行的是BMP图像文件的读取显示部分程序的编写。在掌握BMP图像的具体格式后,建立了DIB函数库文件,对即将使用的数据成员和函数成员进行了初始化设置,然后在VC++环境下上机调试,并添加相应的消息映射函数,独立实现了BMP图像的读取和显示操作,最后在VC++下实现BMP格式的图像向GIF格式的转换。
利用VisualC#处理数字图像
摘要:Visualc#GDI+虽然提供了许多基本的圈像对象和方法功能,但要进行比校复杂的圈像处理,雷妥结合图像处理算法才能实珠这里利用C#语言的GDI+原理,论迷怎样使用技色拒阵和U川进介不安全代码类两种方法,对数字图象进行处理,包括图像的亮度处理、灰度处理、透明处理等.用Unsa介方法实现类似C指针原理,对图像进行逐个象素处理,功能任大;用欲色拒阵方法实现简单,只要对不同的圈象处理定义不同的欲色拒阵,但有布分圈象处理功能无法定义出拒阵.
关健词:欲色拒阵;UnBa加;透明度;欲色失t
Gm+功能主要在屏幕上绘制图形、文字和显示图像,功能强大.这里使用GDI+提供用于存储和操作图像进行处理的Bitlnap位图类.Bitmap对象将每个像素的颜色都存储为32位的数:吻ha、红色、绿色和蓝色各占8位.这四个分量的值都是。到255,其中0表示没有亮度,255表示最大亮度.吻ha分量指定颜色的透明度:0表示完全透明,255表示完全不透明.表示颜色可采用4元组形式(红色、绿色、蓝色、咖ha),即(R,G,B,A)加黄色表示方法为(255,255,0,255);当不使用透明度时,颜色也可采用3元组形式表示(红色、绿色、蓝色).表示颜色的另一种惯例是用浮点数字,1表示亮度达到最大,0表示没有亮度.使用这种惯例,上一段中描述的黄色颜色将用(1,1,0,l)表示,用这种方式来表示颜色也称为颜色矢量.
1使用Unsafe代码类对数字圈象进行处理
在C#中,若要像C语言一样使用指针,则必须使用unsafe关键字,unsa介关键字表示不安全上下文,该上下文是任何涉与指针的操作所必需的.可以在类型或成员的声明中使用朋阴血修饰符,也可在代码块中使用,使用uns川re修饰符的语句块围均被视为不
展开阅读全文