上一篇博客当中,我们认识了如何获取图片的属性,那么这一篇博客我们就来了解一下有关图像的加法和位运算是什么样的,并通过这些运算完成图片的相关操作
文章目录
- 加法运算
- cv2.add()
- cv2.addWeighted()
- 基础操作符 +
- add() 与基础操作符+ 的对比
- 每日总结
加法运算
图像的加法运算可以理解为将两个图像进行像素级别的叠加操作。在加法运算中,对应位置的像素值相加,得到的结果将成为新图像中该位置的像素值。
具体而言,假设有两个图像A和B,它们具有相同的尺寸和通道数。那么对于每一个像素点(x, y)和通道c,加法运算可以表示为:
新像素值 = A(x, y, c) + B(x, y, c)
这个过程对每个像素位置和通道分别进行操作,可以用于图像融合、图像叠加等应用。需要注意的是,加法运算可能导致像素值溢出,所以一般需要进行像素值归一化或截断操作,以保证结果图像的准确性和可视化效果。
也就是说,我们在图片处理当中会对两张图片相同位置的像素点进行读取,然后两个数的和就是咱们型的加法运算。但是我们都知道,我们的图像的取值范围是[0,255],那么要是超过255,我们就需要使用其他方法进行处理。
cv2.add()
cv2.add() 方法是OpenCV中用于图像加法运算的函数之一。下面是一个 cv2.add() 方法的示例:
import cv2
import numpy as np
# 读取两张图像
img1 = cv2.imread('image1.jpg')
img2 = cv2.imread('image2.jpg')
# 执行图像加法运算
result = cv2.add(img1, img2)
# 显示结果图像
cv2.imshow('Result', result)
cv2.waitKey(0)
cv2.destroyAllWindows()
在这个示例中,首先使用 cv2.imread() 函数读取了两张图像,分别命名为 img1
和 img2
。然后使用 cv2.add() 方法将这两张图像进行加法运算,结果保存在 result
变量中。
最后,使用 cv2.imshow() 方法显示结果图像,使用 cv2.waitKey() 等待用户按下键盘上的任意键来关闭窗口,并使用 cv2.destroyAllWindows() 关闭所有窗口。
可能有的朋友会遇到下面的错误
cv2.error: OpenCV(4.8.0) D:\a\opencv-python\opencv-python\opencv\modules\core\src\arithm.cpp:650: error: (-209:Sizes of input arguments do not match) The operation is neither 'array op array' (where arrays have the same size and the same number of channels), nor 'array op scalar', nor 'scalar op array' in function 'cv::arithm_op'
实际上,这是由于我们图像大小和通道可能不一致而导致的。我们使用上一节课学习的属性更改方法,将两张图片改成大小和通道数相同。
我们稍微了解一下resize()这个函数的作用和需要传入的参数。
cv2.resize()
是OpenCV中的一个图像几何变换函数,用于调整图像的大小。它可以按比例缩小或放大图像,也可以通过指定输出图像的大小来进行缩放。
语法:
cv2.resize(src, dsize[, dst[, fx[, fy[, interpolation]]]]) → dst
参数:
src
:要调整大小的输入图像。dsize
:目标输出图像的大小,可以是一个整数,表示输出图像的边长大小,也可以是一个元组,表示输出图像的宽度和高度。dst
:输出图像,可选参数。如果未提供,则函数会自动创建一个与目标输出图像大小相同的图像。fx
:在水平方向上的缩放因子。如果未提供,则默认值为0。fy
:在垂直方向上的缩放因子。如果未提供,则默认值为0。interpolation
:插值方法。指定了图像缩放时所使用的插值方法。默认值为INTER_LINEAR
。
常用的插值方法有:
INTER_NEAREST
:最近邻插值INTER_LINEAR
:双线性插值(默认)INTER_AREA
:区域插值INTER_CUBIC
:双三次插值INTER_LANCZOS4
:Lanczos插值
以下是一个cv2.resize()
方法的例子:
import cv2
# 读取图像
img = cv2.imread('image.jpg')
# 缩放图像
resized_img = cv2.resize(img, (800, 600))
# 显示原始图像和缩放后的图像
cv2.imshow('Original Image', img)
cv2.imshow('Resized Image', resized_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
在这个例子中,我们首先读取了一张图像,然后使用cv2.resize()
方法将图像的大小调整为800x600。最后,我们显示了原始图像和缩放后的图像。
需要注意的是,使用 cv2.add() 方法进行加法运算时,OpenCV会自动进行像素值截断(即使用能够表达的最大值),确保结果图像的像素值在0到255之间。
cv2.addWeighted()
cv2.addWeighted()
是OpenCV中的一种线性混合函数,用于将两个图像进行加权混合。 它可以将两个图像按照一定的权重进行加权混合,并输出一个新的图像。
语法:
cv2.addWeighted(src1, alpha, src2, beta, gamma[, dst[, dtype]]) → dst
参数:
src1
:第一个输入图像。alpha
:第一个输入图像的权重系数。src2
:第二个输入图像。beta
:第二个输入图像的权重系数。gamma
:标量值,用于加到加权和中的每个像素。dst
:输出图像,可选参数。如果未提供,则函数会自动创建一个与输入图像大小相同的图像。dtype
:输出图像的数据类型,可选参数。如果未提供,则自动使用输入图像的数据类型。
以下是一个cv2.addWeighted()
方法的例子:
import cv2
import numpy as np
# 读取图像
img1 = cv2.imread('image1.jpg')
img2 = cv2.imread('image2.jpg')
# 调整图像大小一致
img2 = cv2.resize(img2, (img1.shape[1], img1.shape[0]))
# 加权混合两个图像
dst = cv2.addWeighted(img1, 0.7, img2, 0.3, 0)
# 显示混合后的图像
cv2.imshow('Blended Image', dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
在这个例子中,我们首先读取了两张图像,然后使用cv2.resize()
方法将其中一个图像的大小调整为与另一个图像相同。
接着,我们使用cv2.addWeighted()
方法对两个图像进行加权混合。在这里,我们将第一个图像的权重系数设置为0.7,第二个图像的权重系数设置为0.3,并将gamma值设置为0。
最后,我们显示混合后的图像。
我们可以调整权值来显示不同样式的照片
甚至我们可以不用两次权值相加为1
基础操作符 +
实际上这样的方法我们之前已经演示过了,由于这个方法过于简单,所以我们在这里不做过多的解释。如果我们的取值超过了255,它会进行取余运算。
add() 与基础操作符+ 的对比
通过对比,我们能发现二者加法运算中的不同
import cv2
import numpy as np
# 读取两张图像
img1 = cv2.imread('COLOR_LFS.jpg')
img2 = cv2.imread('COLOR_BIRD.jpg')
# 调整图像尺寸使其相同
img1 = cv2.resize(img1, (img2.shape[1], img2.shape[0]))
result1 = img1+img2
# 执行图像加法运算
result2 = cv2.add(img1, img2)
# 显示结果图像
cv2.imshow('PLUS Result', result1)
cv2.imshow('ADD Result', result2)
cv2.imshow('COLOR_LFS', img1)
cv2.imshow('COLOR_BIRD', img2)
cv2.waitKey(0)
cv2.destroyAllWindows()
每日总结
今天我们虚席了图像的加法运算,add()
和直接使用"+"进行运算。他们之中的区别是,add()
会停留在能够取到的最高值,而+会进行取余运算。我们还学习了addWeighted()方法,他可以按照不同的权值进行加权运算,实现不同的图片显示。