OpenCV图像算数运算可莉版
OpenCV图像算数运算
- 一、图像加法
- 二、图像减法
- 三、图像乘法
- 四、图像除法
- 五、图像位运算
- 位与计算(AND)
- 位或运算(OR)
- 位非运算(NOT)
- 位异或运算(XOR)
- 六、图像混合
在图像处理中,算术运算和位运算是非常基础且重要的操作。
本文将详细介绍如何使用 OpenCV 进行图像的加法、减法、乘法、除法、位运算以及图像混合操作。
一、图像加法
图像加法是将两幅图像的对应像素值相加,生成一幅新的图像。
在 OpenCV 中,可以使用 cv2.add() 函数来实现图像加法。
import cv2
import numpy as np# 读取一张图片
img1 = cv2.imread('D:\Word\keli.jpg')
# 移动这张图片的位置作为图片2
w,h = img1.shape[:2]
M = np.float32([[1, 0, 0], [0, 1, 100]])
img2 = cv2.warpAffine(img1, M, (w, h))
cv2.imwrite('D:\Word\keli-move2.jpg', img2)
# 图像加法
img = cv2.add(img1, img2)
cv2.imwrite('D:\Word\keli-add.jpg', img)cv2.destroyAllWindows()
原图:
移动后:
相加之后:
注意:如果像素值相加后超过 255,OpenCV 会自动将其截断为 255
二、图像减法
图像减法是将两幅图像的对应像素值相减,生成一幅新的图像。
在 OpenCV 中,可以使用 cv2.subtract() 函数来实现图像减法。
import cv2
import numpy as np
# 读取这张图片
img1 = cv2.imread('D:\Word\keli.jpg')
w,h = img1.shape[:2]
# 这是移动
M = np.float32([[1, 0, 0], [0, 1, 100]])
# 这是不移动
M = np.float32([[1, 0, 0], [0, 1, 0]])
img2 = cv2.warpAffine(img1, M, (w, h))
cv2.imwrite('D:\Word\keli-move2.jpg', img2)
cv2.imshow('img2', img2)
cv2.waitKey(0)
# 图像减法
img = cv2.subtract(img1, img2)
cv2.imwrite('D:\Word\keli-sub2.jpg', img)
cv2.imshow('img', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
不移动减完以后是全黑
移动以后因为大块背景是白色的,出现了负片的效果,所以要做到真正的负片只需要用纯白的图减去原图即可
注意:如果像素值相减后小于 0,OpenCV 会自动将其截断为 0。
三、图像乘法
图像乘法是将两幅图像的对应像素值相乘,生成一幅新的图像。
在 OpenCV 中,可以使用 cv2.multiply() 函数来实现图像乘法。
img1 = cv2.imread('D:\Word\keli.jpg')# 变暗img = cv2.multiply(img1, 0.7)# 变亮img = cv2.multiply(img1, 1.2)cv2.imwrite('D:\Word\keli-change2.jpg', img)cv2.imshow('img', img)cv2.waitKey(0)cv2.destroyAllWindows()
四、图像除法
图像除法是将两幅图像的对应像素值相除,生成一幅新的图像。在 OpenCV 中,可以使用 cv2.divide() 函数来实现图像除法。作用和乘法应该是一样的
五、图像位运算
位运算是对图像的每个像素进行二进制位操作。
OpenCV 提供了 cv2.bitwise_and()、cv2.bitwise_or()、cv2.bitwise_not() 和 cv2.bitwise_xor() 函数来实现图像的位运算。
位与计算(AND)
原图AND纯白:
原图AND全黑:
位或运算(OR)
原图OR纯白:(纯白)
原图OR全黑:
位非运算(NOT)
原图NOT:
位异或运算(XOR)
原图ORX纯白:
原图ORX全黑:
六、图像混合
图像混合是将两幅图像按照一定的权重进行线性组合,生成一幅新的图像。
在 OpenCV 中,可以使用 cv2.addWeighted() 函数来实现图像混合。
实例
# 图像混合
alpha = 0.7 # 第一幅图像的权重
beta = 0.3 # 第二幅图像的权重
gamma = 0 # 可选的标量值result = cv2.addWeighted(img1, alpha, img2, beta, gamma)# 显示结果
cv2.imshow('Result', result)
cv2.waitKey(0)
cv2.destroyAllWindows()
参数说明:
alpha:第一幅图像的权重。
beta:第二幅图像的权重。
gamma:可选的标量值,通常设置为 0。
公式:
result = img1 * alpha + img2 * beta + gamma