一、实验目的:
1.了解图像的算术运算在数字图像处理中的初步应用。
2.体会图像算术运算处理的过程和处理前后图像的变化。
二、实验内容:
1.图像的加法运算
图像相加一般用于对同一场景的多幅图像求平均效果,以便有drrrrrr效地降低具有叠加性质的随机噪声。直接采集的图像品质一般都较好,不需要进行加法运算处理,但是对于那些经过长距离模拟通讯方式传送的图像(如卫星图像),这种处理是必不可少的。
在MATLAB中,如果要进行两幅图像的加法,或者给一幅图像加上一个常数,可以调用imadd函数来实现。imadd函数将某一幅输入图像的每一个像素值与另一幅图像相应的像素值相加,返回相应的像素值之和作为输出图像。imadd函数的调用格式如下:
Z = imadd(X,Y)
其中,X和Y表示需要相加的两幅图像,返回值Z表示得到的加法操作结果。
图像加法在图像处理中应用非常广泛。例如,以下代码使用加法操作将图2.1中的(a)、(b)两幅图像叠加在一起:
I = imread(‘flower.tif’);
J = imread(‘rice.tif’);
K = imadd(I,J);
imshow(K);
叠加结果如图2.2所示。
图2.1 待叠加的两幅图像
图2.2 叠加后的图像效果
给图像的每一个像素加上一个常数可以使图像的亮度增加。例如,以下代码将增加图2.3(a)所示的RGB图像的亮度,加亮后的结果如图2.3(b)所示。
RGB = imread(‘flower.tif’);
RGB2 = imadd(RGB,50);
subplot(1,2,1);imshow(RGB);
subplot(1,2,2);imshow(RGB2);
RGB=imread('flower.tif');
RGB2=imadd(RGB,-50);
subplot(1,2,1);imshow(RGB);
subplot(1,2,2);imshow(RGB2);%亮度变暗
加50 减50
图2.3 亮度增加与变暗
两幅图像的像素值相加时产生的结果很可能超过图像数据类型所支持的最大值,尤其对于uint8类型的图像,溢出情况最为常见。当数据值发生溢出时,imadd函数将数据截取为数据类型所支持的最大值,这种截取效果称之为饱和。为了避免出现饱和现象,在进行加法计算前最好将图像转换为一种数据范围较宽的数据类型。例如,在加法操作前将uint8图像转换为uint16类型。
2.图像的减法运算
图像减法也称为差分方法,是一种常用于检测图像变化及运动物体的图像处理方法。图像减法可以作为许多图像处理工作的准备步骤。例如,可以使用图像减法来检测一系列相同场景图像的差异。图像减法与阈值化处理的综合使用往往是建立机器视觉系统最有效的方法之一。在利用图像减法处理图像时往往需要考虑背景的更新机制,尽量补偿由于天气、光照等因素对图像显示效果造成的影响。
在MATLAB中,使用imsubtract函数可以将一幅图像从另一幅图像中减去,或者从一幅图像中减去一个常数。imsubtract函数将一幅输入图像的像素值从另一幅输入图像相应的像素值中减去,再将这个结果作为输出图像相应的像素值。imsubtract函数的调用格式如下:
Z = imsubtract(X,Y);
其中,Z是X-Y操作的结果。以下代码首先根据原始图像(如图2.4(a)所示)生成其背景亮度图像,然后再从原始图像中将背景亮度图像减去,从而生成图2.4(b)所示的图像:
I = imread(‘cameraman.tif’);
background = imopen(cameraman, strel(‘disk’,15));
I2 = imsubtract(rice, background);
subplot(1,2,1);imshow(I);
subplot(1,2,2);imshow(I2);
图2.4 原始图像、减去背景图像
如果希望从图像数据I的每一个像素减去一个常数,可以将上述调用格式中的Y替换为一个指定的常数值,例如:
Z = imsubtract(I,50);
减法操作有时会导致某些像素值变为一个负数,对于uint8或uint16类型的数据,如果发生这种情况,那么imsubtract函数自动将这些负数截取为0。为了避免差值产生负值,同时避免像素值运算结果之间产生差异,可以调用函数imabsdiff。imabsdiff将计算两幅图像相应像素差值的绝对值,因而返回结果不会产生负数。该函数的调用格式与imsubtract函数类似。
3. 图像的乘法运算
两幅图像进行乘法运算可以实现掩模操作,即屏蔽掉图像的某些部分。一幅图像乘以一个常数通常被称为缩放,这是一种常见的图像处理操作。如果使用的缩放因子大于1,那么将增强图像的亮度,如果因子小于1则会使图像变暗。缩放通常将产生比简单添加像素偏移量自然得多的明暗效果,这是因为这种操作能够更好地维持图像的相关对比度。此外,由于时域的卷积或相关运算与频域的乘积运算对应,因此乘法运算有时也被作为一种技巧来实现卷积或相关处理。
在MATLAB中,使用immultiply函数实现两幅图像的乘法。immultiply函数将两幅图像相应的像素值进行元素对元素的乘法操作(MATLAB点乘),并将乘法的运算结果作为输出图形相应的像素值。immulitply函数的调用格式如下:
Z = immulitply(X,Y)
其中,Z=X*Y。例如,以下代码将使用给定的缩放因子对图2.5(a)所示的图像进行缩放,从而得到如图2.5(b)所示的较为明亮的图像:
I = imread(‘room.tif’);
J = immultiply(I,1.2);
subplot(1,2,1);imshow(I);
subplot(1,2,2);imshow(J);
图2.5 原图和乘以因子1.5 的图像
uint8图像的乘法操作一般都会发生溢出现象。Immultiply函数将溢出的数据截取为数据类型的最大值。为了避免产生溢出现象,可以在执行乘法操作之前将uint8图像转换为一种数据范围较大的图像类型,例如uint16。
4.图像的除法运算
除法运算可用于校正成像设备的非线性影响,这在特殊形态的图像(如断层扫描等医学图像)处理中常常用到。图像除法也可以用来检测两幅图像间的区别,但是除法操作给出的是相应像素值的变化比率,而不是每个像素的绝对差异,因而图像除法也称为比率变换。
在MATLAB中使用imdivide函数进行两幅图像的除法。imdivide函数对两幅输入图像的所有相应像素执行元素对元素的除法操作(点除),并将得到的结果作为输出图像的相应像素值。imdivide函数的调用格式如下:
Z = imdivide(X,Y)
其中,Z=X/Y。例如,以下代码将图4所示的两幅图像进行除法运算,请将这个结果和减法操作的结果相比较,对比它们之间的不同之处:
I1= imread(‘cameraman.tif’);
I = double(I1);
J= I * 0.43 + 90;
I2 = uint8(J);
Ip = imdivide(I, I2);
Imshow(Ip, []);
除法操作的结果如图2.6所示。
图2.6 原图和减背景后的图像相除的图像效果
5.图像的四则代数运算
可以综合使用多种图像代数运算函数来完成一系列的操作。例如,使用以下语句计算两幅图像的平均值:
I = imread(‘rice.tif’);
I2 = imread(‘.tif’);
K = imdivide(imadd(I,I2),2);
建议最好不要用这种方式进行图像操作,这是因为,对于uint8或uint16数据,每一个算术函数在将其输出结果传递给下一项操作之前都要进行数据截取,这个截取过程将会大大减少输出图像的信息量。执行图像四则运算操作较好的一个办法就是使用函数imlincomb。函数imlincomb按照双精度执行所有代数运算操作,而且仅对最好的输出结果进行截取,该函数的调用格式如下:
Z = imlincomb(A,X,B,Y,C);
其中,Z=A*X+B*Y+C。MATLAB会自动根据输入参数的个数判断需要进行的运算。例如,以下语句将计算Z=A*X+C:
Z = imlincomb(A,X,C)
而以下语句将计算Z=A*X+B*Y:
Z = imlincomb(A,X,B,Y,)
三、实验程序、实验结果与实验分析:
1.实验程序
(1)图像的加法运算 (脚本test2_1)
I = imread('flower.tif');
whos I
I = I(:,:,1:3);
whos I
J = imread('rice.tif');
whos J
K = imadd(I,J);
imshow(K);
title('叠加后的图像');
figure;
RGB = imread('flower2.tif');
RGB2 = imadd(RGB,50);
subplot(1,2,1);imshow(RGB);
title('原始图像');
subplot(1,2,2);imshow(RGB2);
title('增加50亮度后的图像');
figure;
RGB=imread('flower2.tif');
RGB2=imadd(RGB,-50);
subplot(1,2,1);imshow(RGB);
title('原始图像');
subplot(1,2,2);imshow(RGB2);%亮度变暗
title('减少50亮度后的图像');
(2)图像的减法运算 (脚本test2_2)
I = imread('cameraman.tif');
background = imopen(I, strel('disk',15));
I2 = imsubtract(I, background);
subplot(1,2,1);imshow(I);
title("原始图像")
subplot(1,2,2);imshow(I2);
title("减去背景图像")
(3)图像的乘法运算 (脚本test2_3)
I = imread('room.tif');
J = immultiply(I,1.2);
subplot(1,2,1);imshow(I);
title('原始图像');
subplot(1,2,2);imshow(J);
title('乘以因子1.5 的图像');
(4)图像的除法运算 (脚本test2_4)
I1 = imread('cameraman.tif');
I = double(I1);
J = I * 0.43 + 90;
I2 = J; % 将 I2 保持为双精度类型
Ip = imdivide(I, I2);
subplot(1, 3, 1);
imshow(I1);
title('原始图像');
subplot(1, 3, 2);
imshow(Ip, []);
title('减背景后的图像相除的图像');
subplot(1, 3, 3);
imshow(I2, []);
title('减背景后的图像');
(5)图像的四则代数运算 (脚本test2_5)
I = imread('rice.tif');
whos I
J = imread('room.tif');
whos J
I1 = double(I);
J1= double(J);
K = imlincomb(1.1, I1, 0.9, J1, 50, 'uint16');
whos K
K = uint8(K);
subplot(1, 3, 1);
imshow(I, []);
title('图像 I');
subplot(1, 3, 2);
imshow(J, []);
title('图像 J');
subplot(1, 3, 3);
imshow(K, []);
title('I和J线性组合后的图像');
2.实验结果
(1)图像的加法运算
①两张图像叠加
②增加常数变亮
③变暗后的图像
(2)图像的减法运算
(3)图像的乘法运算
(4)图像的除法运算
(5)图像的四则代数运算
3.实验分析
(1)图像的加法运算
①首先加载名为flower.tif和rice.tif的图像,分别存储在变量I和J中。
I = imread('flower.tif');
J = imread('rice.tif');
②然后将I 转换为只有三个通道的彩色图像,使两幅图像大小和类型保持一致,否则无法叠加。
I = I(:,:,1:3);
③最后使用 imadd 函数将图像 I 和图像 J 进行叠加,结果存储在变量 K 中。
K = imadd(I,J);
①首先使用imread函数加载名为 flower2.tif的彩色图像,存储在变量 RGB 中。
RGB = imread('flower2.tif');
②然后使用imadd函数增加50 RGB 图像的亮度
RGB2 = imadd(RGB,50);
①首先使用imread函数加载名为 flower2.tif的彩色图像,存储在变量 RGB 中。
RGB=imread('flower2.tif');
②然后使用imadd函数减少50 RGB 图像的亮度
RGB2=imadd(RGB,-50);
(2)图像的减法运算
①首先加载名为cameraman.tif的图像
I = imread('cameraman.tif');
②通过 imopen(I, strel('disk',15)) 函数创建了一个结构元素,然后使用 imopen 函数对原始图像 I 进行了开运算操作,以获得背景信息。
background = imopen(I, strel('disk',15));
③使用 imsubtract 函数对原始图像 I 和背景图像进行减法运算,得到了减去背景后的图像 I2
I2 = imsubtract(I, background);
(3)图像的乘法运算
①首先使用imread函数加载图像
I = imread('room.tif');
②使用 immultiply(I,1.5) 对原始图像 I 中的每个像素值乘以因子 1.5
I = imread('room.tif');
注:因子大于 1 时,图像的亮度会增加;因子小于 1 时,图像的亮度会减小。
(4)图像的除法运算
①首先使用imread函数加载图像
I1 = imread('cameraman.tif');
②将原始图像 I1 转换为 double 类型,并进行了一系列线性变换,其中包括乘以一个因子并加上一个偏置值,得到图像 J。
I = double(I1);
J = I * 0.43 + 90;
I2 = J; % 将 I2 保持为双精度类型
③使用 imdivide 函数对原始图像 I 和减去背景后的图像 I2 进行相除操作,得到了相除后的图像 Ip。
Ip = imdivide(I, I2);
(5)图像的四则代数运算
①首先使用imread函数加载图像rice.tif和room.tif
I = imread('rice.tif');
J = imread('room.tif');
②将它们转换为 double 类型以进行线性组合
I1 = double(I);
J1= double(J);
③使用imlincomb函数对图像I和J进行线性组合,权重分别为1.1和0.9,加上偏置值50,结果存储在变量K中。这个操作可以将两幅图像按照给定的权重进行加权组合,从而生成一幅新的图像。使用了uint16类型作为输出图像的数据类型。
K = imlincomb(1.1, I1, 0.9, J1, 50, 'uint16');