代数运算

图像的代数运算是基于图像的标准算术运算(加、减、乘、除等)。图像的代数运算有很多用途,例如,图像的减运算可以用于区分同一个场景或对象的两幅或多幅图像。[大谦MATLAB,dqmatlab点com]

可以用MATLAB算术运算符完成图像运算。但是,在使用这些运算符时,必须先将图像转换为double型。表1-1中列出了工具箱中提供的图像运算函数。

表1-1 图像运算函数

函 数 描 述
imabsdiff 两幅图像的绝对差
imadd 两幅图像的和运算
imcomplement 图像的补运算
imdivide 两幅图像的除运算
imlincomb 两幅图像的线性组合
immultiply 两幅图像的积运算
imsubtract 两幅图像的差运算

需要注意的是,整型运算很容易发生溢出。例如,uint8型数据能保存的最大值为255,当运算结果超出255时将发生溢出。算术运算还会生成分数值,它不能用整型数组表示。

图像运算函数进行整型运算时使用如下规则:

超过整型类型对应范围的值被自动截断;

分数值进行圆整。

例如,如果数据类型是uint8型,结果大于255(包括Inf),则设置为255。表1-2中列出了其他一些示例。

表1-2 截断规则示例

结 果 类 型 截 断 值
300 uint8 255
-45 uint8 0
10.5 uint8 11

图像加运算

当将两幅图像相加或常数与图像相加时,可以使用imadd函数。该函数将两幅图像的对应像素的值相加,将相加得到的和返回给输出图像的对应像素。在图像处理中,图像加运算有很多用途。

用加运算将一幅图像叠加到另一幅图像上。注意,两幅图像的大小和类型必须是相同的。

code.matlab
>> I=imread('rice.png');
>> J=imread('cameraman.tif');
>> K=imadd(I,J);
>> imshow(K)

生成如图1-1所示的图像。

Document Image

图1-1 两幅图像的加运算结果

给图像的每个像素添加一个常数值,可以提高图像的亮度。

将一幅RGB图像加亮。

code.matlab
>> RGB=imread('d:\tree.jpg');
>> RGB2=imadd(RGB, 50);
>> subplot(1,2,1); imshow(RGB);
>> subplot(1,2,2); imshow(RGB2);

生成如图1-2所示的图像。其中左图和右图分别为加亮前后的图像。

Document Image

图1-2 加亮图像

在对两幅图像进行加运算时,结果很容易发生溢出(尤其是uint8型数据)。当发生溢出时,imadd函数将结果截断为数据类型所支持的最大值。为了避免出现这种现象,在进行加运算以前,有必要将图像数据转换为一个更大的数据类型,如uint16型数据。

图像减运算

用imsubtract函数可以完成图像数据与图像数据或常数的减运算。该函数将两幅输入图像的对应像素进行值的减运算,然后将结果返回给输出图像的对应像素。图像减运算可以作为复杂图像处理的前期操作。例如,可以用图像减运算观察同一个场景的多幅图像的变化。

将背景取为当前图像的形态学开运算结果,然后从当前图像中减去该背景。

code.matlab
>> I= imread('d:\flower.png');
>> background=imopen(I, strel('disk',15));
>> subplot(1,2,1);imshow(I);
>> subplot(1,2,2);imshow(I2);

生成如图1-3所示的图形。

Document Image

图1-3 图像减运算

图像减运算可能导致某些像素的值为负。对于无符号数据类型(如uint8或uint16),在发生此类问题时,imsubtract函数将负值截断为0,显示效果为黑色,如图1-3图(b)所示。使用imabsdiff函数可以避免出现负值,并且保留这些像素值的差异。该函数计算两幅图像中对应像素的值之间的绝对值,所以结果总是非负的。

图像乘运算

使用immultiply函数可以完成两幅图像的相乘运算。该函数对两幅输入图像的对应像素进行逐元素的点乘(.*)运算,并且将计算结果返回给输出图像的对应像素。

图像与常数相乘是一个常见的图像处理操作。如果常数大于1,则结果图像变亮;如果常数小于1,则结果图像变暗。一般情况下,图像乘运算比图像加运算得到的明暗效果更自然,因为它更好地保留了图像之间的相对差异。

下面的代码用一个常数因子进行乘运算。

code.matlab
>> I=imread('d:\flower.jpg');
>> J=immultiply(I,1.8);
>> subplot(1,2,1);imshow(I);
>> subplot(1,2,2);imshow(J);

生成结果如图1-4所示,其中左图和右图是进行乘运算之前和之后的图像。

Document Image

图1-4 图像乘运算

uint8型图像相乘常常发生溢出。当发生溢出时,immultiply函数将结果截断为数据类型的最大值。为了避免截断,在进行乘运算以前,可以将uint8型图像数据转换为更大的数据类型,如uint16型。

图像除运算

使用imdivide函数可以对两幅图像进行除运算。该函数对输入图像的对应像素进行逐元素的除运算。immultiply函数将结果返回给输出图像的对应像素。

与减运算类似,图像除运算可用于检测两幅图像之间的差异。但是,除运算不是给出每个像素之间的绝对差异,而是给出对应像素值的分数差异或比率。

将背景取为当前图像的形态学的开运算结果,然后用当前图像除以该背景。

code.matlab
>> I=imread('d:\flower.jpg');
>> I2=imdivide(I,2);
>> subplot(1,2,1);imshow(I);
>> subplot(1,2,2);imshow(I2);

生成如图1-5所示的图形。

Document Image

图1-5 图像除运算结果