opencv合并两张图像(opencv拼接)
## OpenCV 合并两张图像### 简介在图像处理领域,合并两张或多张图像是一个常见的操作。无论是创建全景图、添加水印,还是进行图像叠加,OpenCV 都提供了多种方法来实现图像合并。本文将详细介绍使用 OpenCV 合并两张图像的几种常见方法,并提供代码示例和解释。### 1. 使用 `addWeighted()` 函数进行线性混合`addWeighted()` 函数可以将两张图像按照指定的权重进行线性混合,从而实现图像的叠加效果。
函数原型:
```python dst = cv2.addWeighted(src1, alpha, src2, beta, gamma) ```
参数说明:
`src1`: 第一张图像。
`alpha`: 第一张图像的权重,范围为 0 到 1。
`src2`: 第二张图像。
`beta`: 第二张图像的权重,范围为 0 到 1。
`gamma`: 偏置项,可以是任何值。
`dst`: 输出图像。
代码示例:
```python import cv2img1 = 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() ```
解释:
这段代码首先读取两张图像,并使用 `resize()` 函数将第二张图像的大小调整为与第一张图像相同。然后,使用 `addWeighted()` 函数将两张图像按照 7:3 的比例进行混合。最后,使用 `imshow()` 函数显示混合后的图像。### 2. 使用位操作符进行图像拼接除了线性混合,还可以使用位操作符(如 AND、OR、XOR)将两张图像进行拼接。这种方法适用于将一张图像的一部分覆盖到另一张图像上。
代码示例:
```python import cv2img1 = cv2.imread('image1.jpg') img2 = cv2.imread('image2.jpg')# 选择要覆盖的区域 rows, cols, channels = img2.shape roi = img1[0:rows, 0:cols]# 创建掩码 img2gray = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY) ret, mask = cv2.threshold(img2gray, 10, 255, cv2.THRESH_BINARY) mask_inv = cv2.bitwise_not(mask)# 黑色区域 img1_bg = cv2.bitwise_and(roi, roi, mask=mask_inv)# 白色区域 img2_fg = cv2.bitwise_and(img2, img2, mask=mask)# 将结果添加到 ROI 并修改主图像 dst = cv2.add(img1_bg, img2_fg) img1[0:rows, 0:cols] = dst# 显示结果 cv2.imshow('Result', img1) cv2.waitKey(0) cv2.destroyAllWindows() ```
解释:
这段代码首先读取两张图像,并选择要将 `img2` 覆盖到 `img1` 上的区域。然后,将 `img2` 转换为灰度图像,并使用阈值化操作创建掩码。掩码用于标识 `img2` 中要覆盖到 `img1` 上的区域。最后,使用位操作符将 `img2` 覆盖到 `img1` 上,并显示结果。### 结论本文介绍了使用 OpenCV 合并两张图像的两种常用方法:线性混合和位操作符拼接。`addWeighted()` 函数可以实现图像的叠加效果,而位操作符则可以将一张图像的一部分覆盖到另一张图像上。选择哪种方法取决于具体的应用场景和需求。
OpenCV 合并两张图像
简介在图像处理领域,合并两张或多张图像是一个常见的操作。无论是创建全景图、添加水印,还是进行图像叠加,OpenCV 都提供了多种方法来实现图像合并。本文将详细介绍使用 OpenCV 合并两张图像的几种常见方法,并提供代码示例和解释。
1. 使用 `addWeighted()` 函数进行线性混合`addWeighted()` 函数可以将两张图像按照指定的权重进行线性混合,从而实现图像的叠加效果。**函数原型:**```python dst = cv2.addWeighted(src1, alpha, src2, beta, gamma) ```**参数说明:*** `src1`: 第一张图像。 * `alpha`: 第一张图像的权重,范围为 0 到 1。 * `src2`: 第二张图像。 * `beta`: 第二张图像的权重,范围为 0 到 1。 * `gamma`: 偏置项,可以是任何值。 * `dst`: 输出图像。**代码示例:**```python import cv2img1 = 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() ```**解释:**这段代码首先读取两张图像,并使用 `resize()` 函数将第二张图像的大小调整为与第一张图像相同。然后,使用 `addWeighted()` 函数将两张图像按照 7:3 的比例进行混合。最后,使用 `imshow()` 函数显示混合后的图像。
2. 使用位操作符进行图像拼接除了线性混合,还可以使用位操作符(如 AND、OR、XOR)将两张图像进行拼接。这种方法适用于将一张图像的一部分覆盖到另一张图像上。**代码示例:**```python import cv2img1 = cv2.imread('image1.jpg') img2 = cv2.imread('image2.jpg')
选择要覆盖的区域 rows, cols, channels = img2.shape roi = img1[0:rows, 0:cols]
创建掩码 img2gray = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY) ret, mask = cv2.threshold(img2gray, 10, 255, cv2.THRESH_BINARY) mask_inv = cv2.bitwise_not(mask)
黑色区域 img1_bg = cv2.bitwise_and(roi, roi, mask=mask_inv)
白色区域 img2_fg = cv2.bitwise_and(img2, img2, mask=mask)
将结果添加到 ROI 并修改主图像 dst = cv2.add(img1_bg, img2_fg) img1[0:rows, 0:cols] = dst
显示结果 cv2.imshow('Result', img1) cv2.waitKey(0) cv2.destroyAllWindows() ```**解释:**这段代码首先读取两张图像,并选择要将 `img2` 覆盖到 `img1` 上的区域。然后,将 `img2` 转换为灰度图像,并使用阈值化操作创建掩码。掩码用于标识 `img2` 中要覆盖到 `img1` 上的区域。最后,使用位操作符将 `img2` 覆盖到 `img1` 上,并显示结果。
结论本文介绍了使用 OpenCV 合并两张图像的两种常用方法:线性混合和位操作符拼接。`addWeighted()` 函数可以实现图像的叠加效果,而位操作符则可以将一张图像的一部分覆盖到另一张图像上。选择哪种方法取决于具体的应用场景和需求。