您的位置:

cv2.subtract函数的详解

一、函数概述

cv2.subtract()函数是OpenCV中用于图像减法运算的函数,可以很方便地进行两个图像之间的减法操作,也可以用来对一个图像进行常量的减法操作。

cv2.subtract(src1, src2, dst=None, mask=None, dtype=None) -> dst

其中src1和src2是要进行减法操作的两个输入图像,可以是大小和类型相同的图像,也可以是大小不同但是通道数相同的图像;dst是函数的输出结果,如果不传入该参数,则会生成一个和输入图像类型和大小相同的图像作为输出结果;mask参数则可以用来指定一个掩膜,以只对指定区域进行减法运算;dtype参数则用来指定输出图像的数据类型,如果不传入该参数,则会自动选择src1、src2和输入图像中的数据类型中的最大值作为输出图像的数据类型。

二、图像减法操作

1、两个相同尺寸的图像

首先让我们创建两个相同尺寸的图像,用于后面的减法操作。代码如下:

import cv2
import numpy as np

img1 = np.zeros((200, 200, 3), dtype=np.uint8)
img1[50:150, 50:150, :] = 255
img2 = np.zeros((200, 200, 3), dtype=np.uint8)
img2[70:180, 70:180, :] = 255
cv2.imshow("img1", img1)
cv2.imshow("img2", img2)
cv2.waitKey(0)
cv2.destroyAllWindows()

这里我们创建两个200x200的三通道图像,img1中心部分为白色,img2中心部分为白色且稍微比img1更大。运行代码,可以得到如下图像:

可以看到,我们成功地生成了两个用于后面减法操作的图像。

接下来,我们使用cv2.subtract()函数对这两个图像进行减法操作,代码如下:

result = cv2.subtract(img1, img2)
cv2.imshow("result", result)
cv2.waitKey(0)
cv2.destroyAllWindows()

这里我们将img1减去img2,并将结果保存在result中,然后将result显示出来。运行代码,可以得到如下图像:

可以看到,我们得到了一个新的图像,它的中心部分为白色,并且和img1的中心部分重合。这是因为在减法运算中,两个图像中相同位置的像素值相减,因此img2的中心部分被减去了,而img1的中心部分保留了下来。

2、两个不同尺寸的图像

除了可以对相同尺寸的图像进行减法操作外,cv2.subtract()函数还可以对不同尺寸但是通道数相同的图像进行减法操作。代码如下:

img1 = np.zeros((200, 200, 3), dtype=np.uint8)
img1[50:150, 50:150, :] = 255
img2 = np.zeros((300, 300, 3), dtype=np.uint8)
img2[70:200, 70:200, :] = 255
result = cv2.subtract(img1, img2)
cv2.imshow("result", result)
cv2.waitKey(0)
cv2.destroyAllWindows()

这里我们将img2的大小设为300x300,并将中心部分稍微调大一些。运行代码,可以得到如下图像:

可以看到,我们依然成功地对img1和img2进行了减法操作。这是因为在两个图像大小不同时,cv2.subtract()函数会自动调用resize()函数将图像大小调整为相同,并且进行减法运算。因此,我们得到的结果和两个相同大小的图像进行减法运算时的结果是相同的。

三、常量减法操作

cv2.subtract()函数不仅可以进行图像减法操作,还可以对一个图像进行常量减法操作。代码如下:

img = cv2.imread("lena.jpg")
cv2.imshow("img", img)
cv2.waitKey(0)
cv2.destroyAllWindows()

result = cv2.subtract(255, img)
cv2.imshow("result", result)
cv2.waitKey(0)
cv2.destroyAllWindows()

这里我们读入一张名为lena.jpg的图像,并将它显示出来。然后,我们对这张图像进行常量减法操作:将它的每个像素值从255中减去,并将结果保存到result中。最后将result显示出来。运行代码,可以得到如下图像:

原始图像:

减法结果:

可以看到,我们成功地对lena.jpg图像进行了常量减法操作,并且得到了一个新的图像。这是因为在常量减法操作中,每个像素值都会从常量值中减去,并生成一个新的图像。

四、掩膜减法操作

cv2.subtract()函数还支持使用掩膜对图像进行减法操作,以只对指定区域进行操作。代码如下:

img1 = np.zeros((200, 200, 3), dtype=np.uint8)
img1[50:150, 50:150, :] = 255
img2 = np.zeros((200, 200, 3), dtype=np.uint8)
img2[70:180, 70:180, :] = 255
mask = np.zeros((200, 200), dtype=np.uint8)
mask[90:110, 90:110] = 255
cv2.imshow("img1", img1)
cv2.imshow("img2", img2)
cv2.imshow("mask", mask)
cv2.waitKey(0)
cv2.destroyAllWindows()

result = cv2.subtract(img1, img2, dst=None, mask=mask)
cv2.imshow("result", result)
cv2.waitKey(0)
cv2.destroyAllWindows()

这里我们同样创建两个200x200的图像img1和img2,并用mask生成一个掩膜,指定要进行减法操作的区域。然后,我们使用cv2.subtract()函数对这两个图像进行减法操作,并指定掩膜为mask。运行代码,可以得到如下图像:

可以看到,我们成功地使用掩膜对img1和img2进行了减法操作,只对mask指定的部分进行了减法操作。这是因为在掩膜减法操作中,只有掩膜中像素值为非零的部分才会进行减法操作,因此我们成功地保留了img1中心部分的白色区域。