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()函数将二值化图像进行取反操作。