在图像处理中,算术运算和位运算是非常基础且重要的操作。本文将详细介绍如何使用 OpenCV 进行图像的加法、减法、乘法、除法、位运算以及图像混合操作。
1、基础运算
1.1 图像加法
图像加法是将两幅图像的对应像素值相加,生成一幅新的图像。在 OpenCV 中,可以使用 cv2.add()
函数来实现图像加法,注意两张图片需要保证尺寸相同,如果像素值相加后超过 255,OpenCV 会自动将其截断为 255。
import cv2
# 读取两幅图像
img1 = cv2.imread('image.jpg')
img2 = cv2.imread('bird.jpg')
# 图像加法
result = cv2.add(img1, img2, dtype=cv2.CV_8U)
# 显示结果
cv2.imshow('Result', result)
cv2.waitKey(0)
cv2.destroyAllWindows()
1.2 图像减法
图像减法是将两幅图像的对应像素值相减,生成一幅新的图像。在 OpenCV 中,可以使用 cv2.subtract()
函数来实现图像减法。如果像素值相减后小于 0,OpenCV 会自动将其截断为 0。
import cv2
# 读取两幅图像
img1 = cv2.imread('image.jpg')
img2 = cv2.imread('bird.jpg')
# 图像减法
result = cv2.subtract(img1, img2)
# 显示结果
cv2.imshow('Result', result)
cv2.waitKey(0)
cv2.destroyAllWindows()
1.3 图像乘法
图像乘法是将两幅图像的对应像素值相乘,生成一幅新的图像。在 OpenCV 中,可以使用 cv2.multiply()
函数来实现图像乘法。如果像素值相乘后超过 255,OpenCV 会自动将其截断为 255。
import cv2
# 读取两幅图像
img1 = cv2.imread('image.jpg')
img2 = cv2.imread('bird.jpg')
# 图像乘法
result = cv2.multiply(img1, img2)
# 显示结果
cv2.imshow('Result', result)
cv2.waitKey(0)
cv2.destroyAllWindows()
1.4 图像除法
图像乘法是将两幅图像的对应像素值相乘,生成一幅新的图像。在 OpenCV 中,可以使用 cv2.multiply()
函数来实现图像乘法。如果像素值相乘后超过 255,OpenCV 会自动将其截断为 255。
import cv2
# 读取两幅图像
img1 = cv2.imread('image.jpg')
img2 = cv2.imread('bird.jpg')
# 图像除法
result = cv2.divide(img1, img2)
# 显示结果
cv2.imshow('Result', result)
cv2.waitKey(0)
cv2.destroyAllWindows()
2 图像位运算 (AND, OR, NOT, XOR)
位运算是对图像的每个像素进行二进制位操作。OpenCV 提供了 cv2.bitwise_and()
、cv2.bitwise_or()
、cv2.bitwise_not()
和 cv2.bitwise_xor()
函数来实现图像的位运算。
函数 | 功能 | 应用场景 |
---|---|---|
cv2.bitwise_and() |
按位与操作,只有两个数的二进制同时为1,结果才为1,否则为0。(负数按补码形式参加按位与运算) | 掩码操作、图像分割 |
cv2.bitwise_or() |
按位或操作,参加运算的两个数只要两个数中的一个为1,结果就为1。 | 图像叠加 |
cv2.bitwise_not() |
按位取反操作,单一图像进行取反。 | 图像反色 |
cv2.bitwise_xor() |
按位异或操作,参加运算的两个数,如果两个相应位为“异”(值不同),则该位结果为1,否则为0。 | 图像差异检测 |
2.1 位与运算 (AND)
位与运算是对两幅图像的每个像素进行按位与操作。
import cv2
# 读取两幅图像
img1 = cv2.imread('image.jpg')
img2 = cv2.imread('bird.jpg')
# 位与运算
result = cv2.bitwise_and(img1, img2)
# 显示结果
cv2.imshow('Result', result)
cv2.waitKey(0)
cv2.destroyAllWindows()
2.2 位或运算 (OR)
位或运算是对两幅图像的每个像素进行按位或操作。
import cv2
# 读取两幅图像
img1 = cv2.imread('image.jpg')
img2 = cv2.imread('bird.jpg')
# 位或运算
result = cv2.bitwise_or(img1, img2)
# 显示结果
cv2.imshow('Result', result)
cv2.waitKey(0)
cv2.destroyAllWindows()
2.3 位非运算 (NOT)
位非运算是对图像的每个像素进行按位取反操作。
import cv2
# 读取两幅图像
img1 = cv2.imread('image.jpg')
img2 = cv2.imread('bird.jpg')
# 位非运算
result = cv2.bitwise_not(img1)
# 显示结果
cv2.imshow('Result', result)
cv2.waitKey(0)
cv2.destroyAllWindows()
2.4 位异或运算 (XOR)
位异或运算是对两幅图像的每个像素进行按位异或操作。
import cv2
# 读取两幅图像
img1 = cv2.imread('image.jpg')
img2 = cv2.imread('bird.jpg')
# 位异或运算
result = cv2.bitwise_xor(img1, img2)
# 显示结果
cv2.imshow('Result', result)
cv2.waitKey(0)
cv2.destroyAllWindows()
3 图像混合 (cv2.addWeighted())
图像混合是将两幅图像按照一定的权重进行线性组合,生成一幅新的图像。在 OpenCV 中,可以使用 cv2.addWeighted()
函数来实现图像混合。
import cv2
# 读取两幅图像
img1 = cv2.imread('image.jpg')
img2 = cv2.imread('bird.jpg')
# 图像混合
alpha = 0.7 # 第一幅图像的权重
beta = 0.3 # 第二幅图像的权重
gamma = 0 # 可选的标量值,通常设置为 0。
result = cv2.addWeighted(img1, alpha, img2, beta, gamma)
# 显示结果
cv2.imshow('Result', result)
cv2.waitKey(0)
cv2.destroyAllWindows()