文章目录
- 1 普通加法
- 1 加号相加
- 2 add函数
- 2 加权相加
- 3 按位运算
- 1 按位与运算
- 2 按位或运算、非运算
- 4 掩膜
1 普通加法
1 加号相加
在 OpenCV 中,图像加法可以使用加号运算符(+
)来实现。例如,如果要将两幅图像相加,可以使用以下代码:
import cv2
img1 = cv2.imread("image1.jpg")
img2 = cv2.imread("image2.jpg")
dst = img1 + img2
cv2.imshow("Result", dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
使用+
相加的计算原理是:
y
(
x
)
=
{
a
+
b
,
a
+
b
≤
255
(
a
+
b
)
%
256
,
a
+
b
>
255
\begin{equation} y(x)=\left\{ \begin{aligned} a+b, \quad a+b\leq255\\ (a+b)\%256, \quad a+b>255\\ \end{aligned} \right . \end{equation}
y(x)={a+b,a+b≤255(a+b)%256,a+b>255
即当两份图像相加之后超过上限时,其值为除以256之后的余数。(注意与add函数的计算原理区分)
2 add函数
函数cv2.add()可以用来计算图像像素值相加的和,其语法格式为:
计算结果=cv2.add(像素值a,像素值b)
使用add
相加的计算原理是:
y
(
x
)
=
{
a
+
b
,
a
+
b
≤
255
255
,
a
+
b
>
255
\begin{equation} y(x)=\left\{ \begin{aligned} a+b, \quad a+b\leq255\\ 255, \quad a+b>255\\ \end{aligned} \right . \end{equation}
y(x)={a+b,a+b≤255255,a+b>255
通过对比可以看出两个方式的差异
import cv2
a = cv2.imread("lenacolor.png", 0)
b = a
result1 = a + b
result2 = cv2.add(a, b)
cv2.imshow("original", a)
cv2.imshow("+", result1)
cv2.imshow("add", result2)
cv2.waitKey()
cv2.destroyAllWindows()
除了两个图像相加之外,图像还可以直接与数字相加:
i
m
g
1
=
∣
1
1
1
2
2
2
3
3
3
∣
img1 = \left| \begin{array}{} 1 & 1 & 1 \\ 2 & 2 & 2\\ 3 & 3 & 3 \end{array} \right|
img1=
123123123
执行img2=cv2.add(img1,3)
运算后,可得到:
i
m
g
2
=
∣
4
4
4
5
5
5
6
6
6
∣
img2 = \left| \begin{array}{} 4 & 4 & 4 \\ 5 & 5 & 5\\ 6 & 6 & 6 \end{array} \right|
img2=
456456456
2 加权相加
cv2.addWeighted()
函数是 OpenCV 中的图像加权混合函数。该函数可以将两幅图像按照给定的比例进行混合,得到新的图像。
加权相加的计算方法为:
r
e
s
u
l
t
=
a
c
r
1
×
a
l
p
h
a
+
a
c
r
2
×
b
e
t
a
+
g
a
m
m
a
result = acr1×alpha + acr2×beta + gamma
result=acr1×alpha+acr2×beta+gamma
该函数的语法格式如下:
cv2.addWeighted(src1, alpha, src2, beta, gamma[, dst[, dtype]]) -> dst
参数说明:
src1
:第一幅图像。alpha
:第一幅图像的比例系数。src2
:第二幅图像。beta
:第二幅图像的比例系数。gamma
:结果图像的亮度调节,不调节则填0,但不可省略。dst
:结果图像。dtype
:结果图像的数据类型。
3 按位运算
1 按位与运算
OpenCV 中的按位与运算的计算原理是二进制位的位与运算。
在计算机中,图像的像素是以二进制位的形式存储的,因此按位与运算就是对两个图像的对应像素的二进制位进行“与”运算。
按位与运算的结果取决于两个数的二进制位上的值,如果两个二进制位都是
1
1
1,则结果为
1
1
1,否则结果为
0
0
0。
例如,如果
A
=
10
A=10
A=10(二进制为
1010
1010
1010),
B
=
6
B=6
B=6(二进制为
0110
0110
0110),则
A
and
B
=
2
A \ \text{and} \ B = 2
A and B=2(二进制为
0010
0010
0010)。
在 OpenCV 中,按位与运算可以应用于图像的二值化、边缘检测、形状分析等。通过按位与运算,可以将图像的某些部分提取出来,从而获得更多有用的信息。
通过这一特性,可以实现图片的按掩膜提取功能。
import cv2
import numpy as np
a = cv2.imread("lenacolor.png", 0)
b = np.zeros(a.shape, dtype=np.uint8)
b[100:400, 200:400] = 255
c = cv2.bitwise_and(a, b)
cv2.imshow("a", a)
cv2.imshow("b", b)
cv2.imshow("c", c)
cv2.waitKey()
cv2.destroyAllWindows()
2 按位或运算、非运算
OpenCV 中的按位或运算(Bitwise Or)和非运算(Bitwise Not)是对图像中的每一个像素进行二进制位上的运算。
- 按位或运算:按位或运算的结果取决于两个数的二进制位上的值,如果两个二进制位中至少有一个是 1 1 1,则结果为 1 1 1,否则结果为 0 0 0。
- 非运算:非运算是对图像中每一个像素的二进制位取反,如果原来是 0 0 0,则结果为 1 1 1;如果原来是 1 1 1,则结果为 0 0 0。
在 OpenCV 中,可以使用 cv2.bitwise_or()
和 cv2.bitwise_not()
函数来实现按位或运算和非运算,其使用方法同与运算。
4 掩膜
除了在按位与运算中执行掩膜操作外,在使用add
函数时也可以通过mask
信息。
import cv2
import numpy as np
img1 = cv2.imread("image1.jpg")
img2 = cv2.imread("image2.jpg")
mask = np.zeros(img1.shape[:2], dtype=np.uint8)
cv2.rectangle(mask, (100, 100), (200, 200), (255, 255, 255), -1)
dst = cv2.add(img1, img2, mask=mask)
cv2.imshow("Result", dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
在上面的代码中,首先创建了一个全黑的掩膜,然后使用 cv2.rectangle()
函数在掩膜上绘制了一个白色的矩形,该矩形代表了加法运算只需要应用到图像的一部分。
最后,在调用 cv2.add()
函数时,将掩膜作为参数传入,从而只对图像的矩形区域进行加法运算。