图像灰度化的三种实现方法(C#)

1、C#图像处理基础
(1)、Bitmap类
Bitmap对象封装了GDI+中的一个位图,此位图由图形图像及其属性的像素数据组成,因此Bitmap是用于处理由像素数据定义的图像的对象。该类的主要方法和属性如下:
GetPixel方法和SetPixel方法:获取和设置一个图像的指定像素的颜色。
PixelFormat属性:返回图像的像素格式。
Palette属性:获取或设置图像所使用的颜色调色板。
Height属性和Width属性:返回图像的高度和宽度。
LockBits方法和UnlockBits方法:分别锁定和解锁系统内存中的位图像素。在基于像素点的图像处理方法中使用LockBits和UnlockBits是一个很好的方式,这两种方法可以使我们通过指定像素的范围来控制位图的任意一部分,从而消除了通过循环对位图的像素逐个进行处理的需要。每次调用LockBits之后都应该调用一个UnLockBits。

LockBits方法的定义如下:
Public BitmapData LockBits(Rectangle rect,ImageLockMode flags,PixelFormat format);
LockBits方法使用3个类型,分别为Rectangle,ImageLockMode枚举和PixelFormat枚举的参数,并返回一个类型为BitmapData的对象。
其中,Rectangle参数定义了要在系统内存中锁定的位图的一部分,ImageLockMode枚举提供了对数据的访问方式。PixelFormat枚举表示像素的格式。

UnlockBits方法使用一个由LockBits返回的类型为BitmapData的参数。
Public void UnlockBits(BitmapData bitmapdata);

(2)、BitmapData类
BitmapData对象指定了位图的属性,如下所示:
Height属性:被锁定位图的高度。
Width属性:被锁定位图的宽度。
PixelFormat属性:数据的实际像素格式。
Scan0属性:被锁定数组的首字节地址,如果整个图像被锁定,则是图像的第一个字节地址。
Stride属性:步幅,也称为扫描宽度。

如图所示:数组的宽度并不一定等于图像像素数组的宽度,还有一部分未用区域。这是为了提高效率,系统要确定每行的字节数必须为4的倍数。例如一幅24位、宽位17个像素的图像,它需要每行占有的空间为51(3*17)个字节,但51不是4的倍数,因此还需要补充1个字节,从而使每行的字节数扩展为52(即Stride=52),这样就满足了每行字节数是4的倍数的条件。需要扩展多少个字节不仅是由图像的宽度决定,而且还由图像像素的格式决定。
(3)、Graphics类
Graphics对象是GDI+的关键所在,许多对象都是由Graphics类表示的,该类定义了绘制和填充图形对象的方法和属性。一个应用程序只要需要进行绘制和着色,它就必须使用Graphics对象。

2、彩色图象灰度化
公式:
Gray(i,j)=0.299R(i,j)+0.587G(i,j)+0.114*B(i,j))

3、图象处理的3种方法
(1)、提取像素法
该方法使用的是GDI+中的Bitmap.GetPixel和Bitmap.SetPixel方法。为了将位图的颜色设置为灰度或其他颜色,就需要使用GetPixel来读取当前像素的颜色,再计算灰度值,最后使用SetPixel来应用新的颜色。
(2)、内存法
该方法就是把图像数据直接复制到内存中,这样就使程序的运行速度大大提高。
(3)、指针法
该方法与内存法相似,开始都是通过LockBits方法来获取位图的首地址。但该方法更简洁,直接应用指针对位图进行操作。
为了保持类型安全,在默认情况下,C#是不支持指针运算的,因为使用指针会带来相关的风险。所以C#只允许在特别标记的代码块中使用指针。通过使用unsafe关键字,可以定义可使用指针的不安全上下文。

4、C#中常用的计时器
(1)、System.Timers.Timer和System.Windows.Forms.Timer,它的最低识别为1/18s;
(2)、timeGetTime,它的最低识别能达到5ms;
(3)、System.Environment.TickCount,它的最低识别为毫秒级;
(4)、QueryPerformanceCounter,它的最低识别为1ms;

图像灰度化的三种实现方法(C#)_第1张图片图像灰度化的三种实现方法(C#)_第2张图片
图像灰度化的三种实现方法(C#)_第3张图片图像灰度化的三种实现方法(C#)_第4张图片图像灰度化的三种实现方法(C#)_第5张图片图像灰度化的三种实现方法(C#)_第6张图片图像灰度化的三种实现方法(C#)_第7张图片

你可能感兴趣的:(C#)