在Python中把一个图像叠加在另一个图像上的过程中,可以用OpenCV库来实现。具体步骤如下:
1.读取原图和覆盖图
import cv2
# 读取原图和覆盖图
img1 = cv2.imread("image1.png")
img2 = cv2.imread("image2.png")
2.确定图像叠加的位置
# 确定图像叠加的位置
rows, cols, channels = img2.shape
roi = img1[0:rows, 0:cols]
这里img2
的大小要小于img1
,才能在img1
的特定区域上叠加。rows, cols, channels = img2.shape
得到img2
的行、列和通道数,然后利用这些值,从img1
中选取与img2
大小相同的区域作为覆盖区域roi
。
3.制作蒙版
# 制作蒙版
img2gray = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)
ret, mask = cv2.threshold(img2gray, 10, 255, cv2.THRESH_BINARY)
mask_inv = cv2.bitwise_not(mask)
在将图像叠加时,需要将覆盖区域进行蒙版处理。这里通过将img2
转换为灰度图,然后利用阈值将非黑色部分变成白色(255),制作一个蒙版mask
。用bitwise_not
将mask
中的白色和黑色进行反转,获得mask_inv
。
4.图像叠加操作
# 图像叠加操作
img1_bg = cv2.bitwise_and(roi, roi, mask=mask_inv)
img2_fg = cv2.bitwise_and(img2, img2, mask=mask)
dst = cv2.add(img1_bg, img2_fg)
img1[0:rows, 0:cols] = dst
在进行图像叠加操作时,分别对roi
和img2
进行若干次的位运算,最后将它们加在一起得到叠加图像dst
。然后将dst
放回到原图中的roi
位置,就完成了图像叠加的操作。
下面给出一个完整的代码示例:对于两幅图片A和B,将B的左上角位置放在A的中央位置,并将B图切出来的长宽分别缩小一半后叠加在A图中。
import cv2
# 读取A和B图片
img_A = cv2.imread("image_A.png")
img_B = cv2.imread("image_B.png")
# 获取B图片的大小信息
rows, cols, channels = img_B.shape
# 计算出将B图显示在A图中央的坐标点
center_x = img_A.shape[1] // 2 - cols // 4
center_y = img_A.shape[0] // 2 - rows // 4
# 抠出B图需要覆盖的区域
roi = img_A[center_y:center_y + rows // 2, center_x:center_x + cols // 2]
# 制作蒙版mask和mask_inv
img_B_gray = cv2.cvtColor(img_B, cv2.COLOR_BGR2GRAY)
ret, mask = cv2.threshold(img_B_gray, 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(img_B, img_B, mask=mask)
dst = cv2.add(img1_bg, img2_fg)
# 将叠加后的图像放回到A图
img_A[center_y:center_y + rows // 2, center_x:center_x + cols // 2] = dst
# 显示图片
cv2.imshow("result", img_A)
cv2.waitKey(0)
cv2.destroyAllWindows()
另一种示例,将两张图片按照一定的权值混合在一起。
import cv2
# 读取两张图片
img1 = cv2.imread("image1.png")
img2 = cv2.imread("image2.png")
# 设定混合比例
alpha = 0.7
beta = 1 - alpha
# 图像混合
result = cv2.addWeighted(img1, alpha, img2, beta, 0)
# 显示图片
cv2.imshow("result", result)
cv2.waitKey(0)
cv2.destroyAllWindows()
在上面的示例中,利用cv2.addWeighted()
函数对两张图片进行按权重混合,最后得到一个新的混合后的图像result
,其中alpha
表示第一张图片的权重,beta
表示第二张图片的权重,0
表示亮度权重。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解在Python中把一个图像叠加在另一个图像上 - Python技术站