3.1.2 cv2.add()函数

函数cv2.add()可以用来计算图像像素值相加的和,其语法格式为

使用函数cv2.add()对像素值a和像素值b进行求和运算时,如果求得的和超过了当前图像像素值所能够表示的范围,则使用所能表示范围的最大值作为计算结果。该最大值,一般被称为图像的像素饱和值,所以函数cv2.add()的求和一般被称为饱和值求和(也被称为饱和求和、饱和运算、饱和求和运算等)。

例如,8位灰度图像的饱和值为255,因此,在对8位灰度图的像素值求和时,遵循以下规则:

根据上述规则,在对256级的灰度图像(8位灰度图)中的两个像素点进行加法运算时:

● 如果两个像素值的和小于或等于255,则直接相加得到运算结果。例如,像素值28和像素值36相加,得到计算结果64。

● 如果两个像素值的和大于255,则将运算结果处理为饱和值255。例如255+58=313,大于255,则得到计算结果255。

需要注意,函数cv2.add()中的参数可能有如下三种形式。

● 形式1:计算结果=cv2.add(图像1,图像2),两个参数都是图像,此时参与运算的图像大小和类型必须保持一致。

● 形式2:计算结果=cv2.add(数值,图像),第1个参数是数值,第2个参数是图像,此时将超过图像饱和值的数值处理为饱和值(最大值)。

● 形式3:计算结果=cv2.add(图像,数值),第1个参数是图像,第2个参数是数值,此时将超过图像饱和值的数值处理为饱和值(最大值)。

上述三种形式将在本章的后续小节中进一步介绍。

【例3.2】使用随机数组模拟灰度图像,观察函数cv2.add()对像素值求和的结果。

根据题目要求,编写程序如下:

运行程序,得到如下计算结果:

从上述运行结果可知,当使用函数add求和时,如果两个像素值的和大于255,则将运算结果处理为饱和值255。

【例3.3】分别使用加号运算符和函数cv2.add()计算两幅灰度图像的像素值之和,观察处理结果。

根据题目要求,编写程序如下:

在本例中,首先读取了图像lena并将其标记为变量a;接下来,使用语句“b=a”将图像lena复制到变量b内;最后,分别使用“+”和函数cv2.add()计算a和b之和。

运行程序,得到如图3-1所示的运行结果,其中:

● 图3-1(a)是原始图像lena。

● 图3-1(b)是使用加号运算符将图像lena自身相加的结果。

● 图3-1(c)是使用函数cv2.add()将图像lena自身相加的结果。

图3-1 【例3.3】程序的运行结果

从上述运算结果可以看出:

● 使用加号运算符“+”计算图像像素值的和时,将和大于255的值进行了取模处理,取模后大于255的这部分值变得更小了,导致本来应该更亮的像素点变得更暗了,相加所得的图像看起来并不自然。

● 使用函数cv2.add()计算图像像素值的和时,将和大于255的值处理为饱和值255。图像像素值相加后让图像的像素值增大了,图像整体变亮。

上述两种计算方式在生活中也存在着大量的使用场景,例如:

● 电表、水表及手表,使用的都是取模的方式。它们的终点和起点是重叠的,到达终点后,就是一个新的起点。例如,电表走到“9999”后,继续从“0000”开始计数;手表走到12点后,重新从0点开始计数。

● 汽车速度显示盘等场景使用的是饱和值方式。当汽车速度超过表盘能显示的最大值时,表盘显示的就是最大值,不会从0开始重新计数。

在图像处理过程中,可以根据实际需求场景的不同,选择上述两种计算方式中的一种来完成运算。