如何使用Python对图像进行算术运算

在本教程中,我们将学习如何使用 Python 对图像执行不同的算术运算。我们将执行不同的运算,例如加法、减法、乘法和除法。


图像的算术运算是什么意思?

图像算术是指对图像进行的算术运算。每当我们对图像执行任何算术运算时,都是对各个像素值执行的。例如:如果图像是彩色的,则按如下方式执行添加:

f_img(i, j, k) = img1(i, j, k) + img2(i, j, k)
or
f_img(i, j, k) = img1(i, j, k) + constant

如果图像是灰度图像,则按如下方式执行加法:

f_img(i, j) = img1(i, j) + img2(i, j)
or
f_img(i, j) = img1(i, j) + constant

类似地,也对图像进行其他算术运算。要首先对图像执行任何算术运算,我们必须使用 cv2.imread() 方法加载图像。

正如我们所知,图像被加载为 NumPy N 维数组,因此对它们执行不同的算术运算变得非常容易。注意:如果对两个或多个图像执行算术运算,则所有图像应具有相同的类型,如 jpeg、jpg、png 等、**深度尺寸

**深度:用于表示每个像素的位数,例如每个通道 8 位,通常称为 24 位彩色图像(8 位 x 3 通道)。

使用OpenCV对图像进行算术运算

首先,我们必须安装OpenCV-Python库,然后在 Python 程序中导入cv2模块。以下是安装 OpenCV-Python 并导入 cv2 模块的命令:

# Installing OpenCV-Python library
pip install opencv-python
# Importing cv2 module
import cv2

1. 图像添加

我们可以添加两个图像或向图像添加一个常量值。图像相加通常用作某些复杂过程中的中间步骤,而不是单独用作有用的操作。

在进行适当的遮蔽后,它可用于将一幅图像覆盖在另一幅图像上。我们可以通过两种方式进行图像添加:

  • NumPy 加法:在此,我们只需加载图像文件并使用 (+) 运算符添加加载图像后返回的 NumPy Nd 数组。这是一种模运算,意味着如果输入(加载)图像的像素值相加后所得像素值大于 255,则将所得像素值与 256 进行模 (%)(对于 8 位图像格式)计算并分配给结果像素值,使其保持在 255 或 255 以下,因为任何像素值都不能超过 255。例如: 250+10 = 260 => 260 % 256 = 4
示例图片 1
示例图片 2
# Reading image files
img1 = cv2.imread('sample-img-1.jpg')
img2 = cv2.imread('sample-img-2.jpg')
 
# Applying NumPy addition on images
fimg = img1 + img2
 
# Saving the output image
cv2.imwrite('output.jpg', fimg)

输出

输出图像

OpenCV 添加:在此,我们只需加载图像文件并将加载图像后返回的 NumPy Nd 数组cv2.add()作为参数传递给该方法。这是一种饱和 操作,意味着如果输入(加载)图像的像素值相加后所得像素值大于 255,则它会饱和到 255,这样任何像素值都不能超过 255。这称为**饱和度例如: 250+10 = 260 => 255

**饱和度是一种图像处理技术,用于处理像素溢出,其中我们将所有溢出像素设置为最大可能值。

# Reading image files
img1 = cv2.imread('sample-img-1.jpg')
img2 = cv2.imread('sample-img-2.jpg')
 
# Applying OpenCV addition on images
fimg = cv2.add(img1, img2)
 
# Saving the output image
cv2.imwrite('output.jpg', fimg)

输出:

输出图像

注意:始终建议坚持使用 OpenCV 函数对图像执行不同的操作,因为它们提供了更好的结果,正如您从上面两个示例的输出中看到的那样。

2.图像减影

图像减法只是像素减法,将两个图像作为输入并产生第三个图像作为输出,其像素值只是第一幅图像的像素值减去第二幅图像的相应像素值。我们还可以使用单个图像作为输入,并从其所有像素值中减去一个常数值。某些版本的运算符将输出像素值之间的绝对差,而不是直接的带符号输出。

如果输出像素值为负,图像减法的实现方式会有所不同。如果图像格式支持像素的负值,在这种情况下,负值就可以了。如果图像格式不支持负像素值,则通常将此类像素设置为零(即通常为黑色)。或者

如果图像减法计算使用相同像素值类型的两个输入图像的绝对差,则输出像素值不能超出输入图像像素类型可以表示的指定范围,因此不会出现此问题。这就是为什么最好使用绝对差异。同样,我们可以通过两种方式执行图像减法:

NumPy 减法和 OpenCV 减法。

我们只会使用 OpenCV 减法,因为它能产生更好的结果并且被广泛使用。cv2.subtract()方法用于图像相减,结果将类似于res = img1 - img2其中img1img2是相同深度和类型的图像。

图像减法既用作复杂图像处理技术的中间步骤,又用作其本身的重要操作。图像减法的一种最常见用途是从场景中减去照明的背景变化,以便可以更容易、更清晰地分析前景中的物体。

注意:我们也将使用相同的示例图像进行图像减法。

# Reading image files
img1 = cv2.imread('sample-img-1.jpg')
img2 = cv2.imread('sample-img-2.jpg')
 
# Applying OpenCV subtraction on images
fimg = cv2.subtract(img1, img2)
 
# Saving the output image
cv2.imwrite('output.jpg', fimg)

输出:

输出图像

3.图像乘法

与图像上的其他算术运算一样,图像乘法也可以以形式实现。图像乘法的第一种形式采用两个输入图像并产生输出图像,其中像素值是输入图像的相应像素值的乘积。

第二种形式采用单个输入图像并产生输出,其中每个像素值是输入图像的相应像素值与指定常数(缩放因子)的乘积。图像乘法的第二种形式使用更广泛,通常称为缩放

图像缩放有多种用途,但通常缩放因子大于 1,缩放将使图像变亮,而缩放因子小于 1 将使图像变暗。

缩放通常会在图像中产生比简单地向像素值添加偏移量更自然的增亮或变暗效果,因为它可以更好地保留图像的相对对比度。

注意:常量值通常是浮点数,根据该值可以增加或减少图像强度。如果图像格式支持的话,它可能是负数。如果计算出的输出值大于最大允许像素值,则在该最大允许像素值处截断输出值。

让我们使用 NumPy 图像乘法来增加下面给出的示例图像的亮度。

示例图片
# Reading image file
img = cv2.imread('sample_img.jpg')
 
# Applying NumPy scalar multiplication on image
fimg = img * 1.5
 
# Saving the output image
cv2.imwrite('output.jpg', fimg)

输出:

输出图像

现在让我们看看使用 OpenCV 图像乘法应用该示例图像时的变化,该cv2.multiply()方法通常采用两个图像数组或一个图像数组和一个指定常量。

# Reading image file
img = cv2.imread('sample_img.jpg')
 
# Applying OpenCV scalar multiplication on image
fimg = cv2.multiply(img, 1.5)
 
# Saving the output image
cv2.imwrite('output.jpg', fimg)

输出:

输出图像

4.图像分割

图像除法操作通常以两个图像作为输入并产生第三图像,其像素值是第一图像的像素值除以第二图像的相应像素值。

它还可以与单个输入图像一起使用,在这种情况下,图像的每个像素值都除以指定的常数。

图像除法运算可用于像减法一样的变化检测,但除法运算不是给出从一个图像到另一个图像的每个像素值的绝对变化,而是给出相应像素值之间的分数变化或比率。

这就是为什么它通常被称为配给。

让我们使用图像除法来降低上述示例图像的亮度,该cv2.divide()方法通常采用两个图像数组或一个图像数组和一个指定常数。

# Reading image file
img = cv2.imread('sample_img.jpg')
 
# Applying OpenCV scalar division on image
fimg = cv2.divide(img, 2)
 
# Saving the output image
cv2.imwrite('output.jpg', fimg)

输出:

输出图像

或者我们也可以使用NumPy 除法来降低上述示例图像的亮度,如下所示:

# Reading image file
img = cv2.imread('sample_img.jpg')
 
# Applying NumPy scalar division on image
fimg = img / 2
 
# Saving the output image
cv2.imwrite('output.jpg', fimg)

输出:

输出图像

结论

在本教程中,我们学习了如何对图像执行不同的算术运算,分析了用于执行图像算术的不同 OpenCV 方法的工作原理,并了解了这些图像算术运算的用途,例如饱和度、配给、缩放