2024年4月12日发(作者:)

图像合成原理及其实现

1 引言

图像融合是指将多源信道所采集到的关于同一目标的图像经过一定的处理,

提取各自信道的信息,最后综合成同一图像以供观察或进一步处理,图像的合成

则是其基础。同样,在Photoshop软件中图像合成相关技术,如蒙板、不透明度、

羽化与渐变等也起着十分重要的作用。

本文拟从图像处理的角度分析它们的原理,并介绍它们在Win32编程环境下

的实现。

2 位图函数

图像的合成在图像处理中属于图像的代数/逻辑运算,即两幅图像对应像素间的运算

[2][3]

。因此,要求参与运算的图像必须类型与尺寸都一致。尺寸的一致可以通过裁剪或缩放

来实现。类型的不同则需要作相应的转换。

在16位的Windows 3.x中图像通常存放在设备无关位图(DIB)中,它只能存放像素数据

无法支持图形功能,其中的BitBlt函数只能拷贝图像而不能进行图像类型的转换,使用十分

不便。

在32位的Win32中,图像一般存放在新型位图DIBSection中,它既具设备无关位图(DIB)

可存放像素数据的特点,又具设备相关位图(DDB)具有图形功能的优点,其中的BitBlt函数

既能拷贝图像又能进行图像类型的转换,像素数据在传递过程中还可以进行多种逻辑运算。

这是图像合成中使用十分频繁的函数。图像尺寸的改变可采用StretchBlt函数,它可以进行

缩放,同时也可进行图像类型的转换,但不支持逻辑运算功能。对于类型与尺寸不一致的图

像需要用BitBlt与StretchBlt函数先行统一。

3 图像合成

3.1 图像的Alpha混合

在Win32中AlphaBlend函数用于实现两幅图像的合成,合成运算通过公式(2)~(4)实现。

T

3

.R = Alpha×T

1

.R + (1–Alpha)×T

2

.R (2)

T

3

.G = Alpha×T

1

.G + (1–Alpha)×T

2

.G (3)

T

3

.B = Alpha×T

1

.B + (1–Alpha)×T

2

.B (4)

其中T

1

、T

2

为输入图像,T

3

为结果图像,Alpha表示图像T

1

的透明度,1–Alpha则为图

像T

2

的透明度。直观地说,图像合成可以看成各图像在具有一定透明度的滤光片覆盖下分

别暴光所得结果的叠加。此时,T

1

使用透明度Alpha的滤光片,T

2

使用透明度1–Alpha的

滤光片分两次暴光得到T

3

其次,由于红绿蓝3分量的计算公式相同,所以真彩色图像的合成等价于3倍宽度的灰

阶图像的合成。合成公式实际上只需要一个,例如公式(2)。比较公式(1)与(2)可知,从图像

处理的角度看,图像的合成可看作两幅输入图像互补的灰度线性变换的叠加。

这样,C语言图像合成程序的主循环如下:

for (i=0; i

(*bufw)=(Alpha*(*bufa)+

(255-Alpha)*(*bufw))>>8;

}

其中,bufa与bufw是指向源、目标图像处理像素的指针,size是图像总的字节数。此

程序同时适用于真彩色图像与灰阶图像。

3.2 图像合成的实现

Win32中的AlphaBlend函数已能实现图像的合成,可以直接调用,其中T

3

与T

2

为同一

图像。为了便于提高效率、扩大功能,不妨也采用查表法来实现。

与灰度变换的查表法一样,分两步进行。假定i为当前像素的偏移,v

s

与v

d

分别为源

与目标图像对应分量的强度,即v

s

=bufw[i],v

d

= bufa[i]。则合成算法如下:

⑴ 构成转换表

按各图像的透明度构成源与目标图像的转换表tabS与tabD。两转换表均为256个表项

的一维数组,对应强度值0~255时的转换结果。

⑵ 逐像素、逐分量进行叠加

① 从tabS与tabD中查得变换后的分量值c

s

=tabS[v

s

]与c

d

=tabD[v

d

]。

② 将相应的分量值相加,即得c=c

s

+c

d

此算法简单,容易优化生成高效的程序,也容易用硬件来实现。表1给出了用不同方法

实现图像等透明度合成的运行时间。

表1 图像等透明度合成的运行时间(单位:毫秒)

源/目标

灰阶/灰阶

真彩/真彩

灰阶/真彩

真彩/灰阶

AlphaBlend

57.99

10.91

9.82

60.06

线性叠加

1.32

3.98

5.68

54.31

查表法

0.89

2.63

4.21

52.32

bufw++; bufa++;

表中,源图像与目标图像分4种不同情况,结果放在目标图像中。线性叠加采用公式(2),

查表法为本节所述方法。

比较表中第3第4行,第4行的运行时间都比第3行长,原因在于源与目标图像属不同

类型,合成过程中需要作类型转换。由此可见,用BitBlt函数将真彩色图像转换为灰阶图像

比反过程要慢许多。其次,左上角灰阶图像的合成反而比真彩色图像的合成更慢,说明

AlphaBlend函数主要适用于真彩色图像的合成,用于灰阶图像时反而需要作附加的转换影响

合成速度。最后,上面3种情况下查表法都比线性叠加快三分之一左右。图1中(c)为(a)与(b)

的合成图像,全图的透明度相同。

源图像1 源图像2

合成图像3