python中opencv图像叠加、图像融合、按位操作的具体实现

1. 图像叠加实现

图像叠加可以将两张图像叠在一起,其中一个图像可以看做是主图像,而另一个图像则是作为 叠加层 。在OpenCV中,可以使用 cv2.addWeighted() 函数实现图像叠加。

1.1 addWeighted函数原型

dst = cv2.addWeighted(src1, alpha, src2, beta, gamma[, dst[, dtype]])

这个函数接收6个参数,其中src1和src2分别是需要叠加的两张图像,alpha和beta分别是两张图像的权重因子,gamma则是亮度值,用于调整图像的亮度,dst则是叠加后的结果图像。

1.2 图像叠加代码实现

下面是一个简单的图像叠加的实现代码:

import cv2

img1 = cv2.imread("image1.jpg")

img2 = cv2.imread("image2.jpg")

dst = cv2.addWeighted(img1, 0.8, img2, 0.2, 0)

cv2.imshow("dst", dst)

cv2.waitKey(0)

cv2.destroyAllWindows()

这段代码将两张jpg格式的图像读入img1和img2中,然后使用cv2.addWeighted()函数进行叠加操作,最终将结果显示出来。

2. 图像融合实现

图像融合与图像叠加类似,但是它可以让两张图像的边缘更加自然地融合在一起,形成一张更加自然的图像。在OpenCV中,可以使用 cv2.addWeighted() 函数和 cv2.bitwise_and() 函数实现图像叠加。

2.1 addWeighted函数的应用

另一个常用的实现图像融合的函数是cv2.addWeighted()函数,原理与图像叠加类似。下面是一个简单的实现图像融合的代码:

import cv2

img1 = cv2.imread("image1.jpg")

img2 = cv2.imread("image2.jpg")

# 图像融合

dst = cv2.addWeighted(img1, 0.7, img2, 0.3, 0)

cv2.imshow("dst", dst)

cv2.waitKey(0)

cv2.destroyAllWindows()

该代码将两张图像进行融合,其中img1的权重因子为0.7,img2的权重因子为0.3,最后显示出融合后的图像。

2.2 bitwise_and函数的应用

在许多情况下,我们可能只需要将两张图像的某个部分进行融合,而不是整张图像。在这种情况下,我们可以使用 cv2.bitwise_and() 函数实现图像融合。该函数接受两个参数,前者是需要融合的两张图像,后者则是一个掩膜,用于指定需要融合的区域。下面是一段代码:

import cv2

import numpy as np

img1 = cv2.imread("image1.jpg")

img2 = cv2.imread("image2.jpg")

img2 = cv2.resize(img2, img1.shape[1::-1])

# 创建掩膜

mask = np.zeros(img1.shape[:2], dtype=np.uint8)

mask[100:500, 100:500] = 255

# 图像融合

dst = cv2.bitwise_and(img1, img2, mask=mask)

cv2.imshow("dst", dst)

cv2.waitKey(0)

cv2.destroyAllWindows()

这段代码从文件中读入两张文件,然后使用np.zeros()函数创建了一张掩膜矩阵mask,将矩阵的一部分赋值为255。接着使用cv2.resize()函数将img2缩放到和img1的大小相同。最后使用cv2.bitwise_and()函数和掩膜融合这两张图像的局部区域。

3. 按位操作的实现

在OpenCV中,有一些常用的按位操作可以帮助我们处理图像的一些基本操作,比如获取一个图像的边缘信息。最常用的按位操作有以下几种:

cv2.bitwise_and(): 按位与运算,表示将两张图像的每一位都进行相与运算。

cv2.bitwise_or(): 按位或运算,表示将两张图像的每一位都进行相或运算。

cv2.bitwise_xor(): 按位异或运算,表示将两张图像的每一位都进行相异或运算。

cv2.bitwise_not(): 取反操作,表示将一张图像的每一位都取反。

3.1 bitwise_and的应用

按位与运算可以帮助我们获取图像边缘信息。下面是一段按位与运算实现的代码:

import cv2

img = cv2.imread("image.jpg")

# 边缘检测

gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

_, thresh = cv2.threshold(gray_img, 0, 255, cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)

edges = cv2.Canny(thresh, 30, 80)

# 按位与运算

dst = cv2.bitwise_and(img, img, mask=edges)

cv2.imshow("dst", dst)

cv2.waitKey(0)

cv2.destroyAllWindows()

这段代码首先读取一张图像,然后将图像转换为灰度图像,并使用cv2.threshold()函数和cv2.Canny()函数将图像转换为边缘信息。最后使用cv2.bitwise_and()函数和edges参数进行按位与运算,提取出图像的边缘信息。

3.2 bitwise_not的应用

我们可以使用cv2.bitwise_not()函数对二值化图像进行取反操作。例如下面这段代码:

import cv2

img = cv2.imread("image.jpg")

# 边缘检测

gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

_, thresh = cv2.threshold(gray_img, 0, 255, cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)

# 取反操作

dst = cv2.bitwise_not(thresh)

cv2.imshow("dst", dst)

cv2.waitKey(0)

cv2.destroyAllWindows()

这段代码的实现和前面一段代码类似,只不过最后使用cv2.bitwise_not()函数将二值化图像进行取反操作。

后端开发标签