Delphi图像处理 -- 图像的灰度化、二值化及反色

图像的灰度化、二值化和反色是些较简单的图像像素处理过程,我在《GDI+ 在Delphi程序的应用 -- ColorMatrix与图像灰度化》和《GDI+ 在Delphi程序的应用 -- 图像二值化》二篇文章中讲了如何利用GDI+的ColorMatrix实现图像灰度化和二值化,但是那种处理只适合GDI+的图像类,本文的方法同时适用于GDI+图像和Delphi的TGraphic图像。

代码如下:

灰度化过程还是依照大多数图像灰度处理惯例,计算YUV颜色空间的Y分量作为灰度图,公式为:

Y = 0.299 * R + 0.587 * G + 0.114 * B

本文灰度过程使用了定点数处理,将上面公式中的常数乘上1024,加快了处理过程,伪代码为:

Y = (306 * R + 601 * G + 117 * B + 512) >> 10

代码中的+512是做四舍五入,右移10位等于除以1024。

图像灰度统计过程和图像灰度化过程采用了相同的原理和计算过程,只不过没有改变图像,而是以计算结果作为256色灰度阶数组的下标,增加该灰度阶的个数而已。所有图像灰度统计指标都存放在TGrayStatData类型的结构中。见《Delphi图像处理 -- 数据类型及内部过程》。

图像二值化过程是在图像灰度处理基础上进行的,由于R、G、B三个分量相等,所以只要把任何其中一个与阀值比较即可:大于阀值为255,否则为0。因灰度图像素格式是32位的,所以过程中直接以0x00FFFFFF或RGB三个分量为255,以0xFF000000与RGB三个分量为0,图像二值化的黑白效果取决于阀值的大小。

因有些图像的灰度分布不太均匀,为了加强图像的二值特征,本文尝试写了一个图像动态分组二值化过程ImageDynamTwoValues,即将图像分组为一定大小的子图,对各子图分别进行灰度统计后,以该子图的灰度平均值为阀值进行子图的二值化,不过在测试过程中,发现如果子图尺寸确定的不合适,各子图之间有很明显的区别,这对图像的二值分析显然是不利的。

至于图像的反色处理更简单,直接用0xFFFFFF和RGB异或就成。

下面是几个图像处理过程处理(不包括图像动态分组二值化过程)的效果图:

Delphi图像处理 -- 图像的灰度化、二值化及反色

图像动态分组二值化例子:

例子中,被注销的代码是使用缺省阀值(127)的全图二值化。

下面是2种方法处理的二值化效果图,上图为原图,中间为全局二值化效果,下图是以128大小的子图分组产生的动态二值化效果图:

原图

全局二值化图

分组动态二值化图(128)

文章中所用数据类型及一些过程见《Delphi图像处理 -- 数据类型及内部过程》和《Delphi图像处理 -- 图像像素结构与图像数据转换》。

尽管我十分努力,但水平有限,错误在所难免,欢迎指正和指导。邮箱地址:

[email protected]

注:本文代码于2010.5.20重新修订过。

你可能感兴趣的:(数据结构,Delphi)