温馨提示:这篇文章已超过464天没有更新,请注意相关的内容是否还可用!
OpenCV利用掩码可以将两张图像合成一张图。具体过程为:先创建一张掩码图像,其尺寸与待合成的两张图像一致。利用掩码中的像素值决定两张图像的融合方式。在对应像素位置,掩码值为1的部分采用第一张图像像素,为0的部分采用第二张图像像素。通过这种方式,可以根据掩码的形状和值,将两张图像无缝合成一张,实现图像融合的效果。
关于第一种方法,通过调整两张图片的透明度权重进行融合,虽然代码简单,但合成效果往往不理想,可能会导致两张图片的清晰度都有所损失,具体的Python代码如下:
import cv2 as cv import numpy as np img1 = cv.imread('ml.png') img2 = cv.imread('opencv-logo.png') dst = cv.addWeighted(img1, 0.7, img2, 0.3, 0) # 调整权重值以改变融合效果 cv.imshow('dst', dst) cv.waitKey(0) cv.destroyAllWindows()
关于第二种方法,通过掩码的方式结合两张图片,这种方法的关键在于设计合适的掩码(mask),在OpenCV中,可以利用图像的二值化操作生成掩码,通过创建一个与图像大小相同的掩码,并将其与原始图像进行位运算,可以保留或剔除图像的特定部分,具体的Python代码如下:
import cv2 as cv import numpy as np import matplotlib.pyplot as plt img1 = cv.imread('messi5.jpeg') # 图像大小可能不够,需要扩充 img2 = cv.imread('opencv-logo.png') # 确保图像大小适合叠加到img1上 rows, cols, channels = img2.shape # 获取图像尺寸信息 roi = img1[0:rows, 0:cols] # 创建用于叠加的区域 创建掩码并对其进行处理 img2gray = cv.cvtColor(img2, cv.COLOR_BGR2GRAY) # 将图像转换为灰度图 img2gray[img2gray == 0] = 255 # 将灰度图中的黑色部分变为白色(用于创建掩码) ret, mask = cv.threshold(img2gray, 50, 255, cv.THRESH_BINARY) # 设置阈值以生成二值化掩码 mask_inv = cv.bitwise_not(mask) # 创建反向掩码(黑色部分保留,白色部分剔除) 使用掩码结合两张图片 img1_bg = cv.bitwise_and(roi, roi, mask=mask_inv) # 使用反向掩码保留img1的背景部分 img2_fg = cv.bitwise_and(img2, img2, mask=mask) # 使用掩码保留img2的前景部分(logo) dst = cv.add(img1_bg, img2_fg) # 将前景和背景合并为一个图像 img1[0:rows, 0:cols] = dst # 将合成后的图像替换原始img1的对应区域 显示处理过程中的图像(掩码、反向掩码等)和最终合成图像(用于验证效果) plt.subplot(231), plt.title("mask"), plt.imshow(cv.cvtColor(mask, cv.COLOR_GRAY2RGB)) # 显示掩码图像(RGB格式) plt.subplot(232), plt.title("mask_inv"), plt.imshow(cv.cvtColor(mask_inv, cv.COLOR_GRAY2RGB)) # 显示反向掩码图像(RGB格式) plt.subplot(233), plt.title("img1_bg"), plt.imshow(cv.cvtColor(img1_bg, cv.COLOR_BGR2RGB)) # 显示背景图像(RGB格式) plt.subplot(234), plt.title("img2_fg"), plt.imshow(cv.cvtColor(img2_fg, cv.COLOR_BGR2RGB)) # 显示前景图像(logo)(RGB格式) plt.subplot(235), plt.title("dst"), plt.imshow(cv.cvtColor(dst, cv.COLOR_BGR2RGB)) # 显示合成后的图像(RGB格式) plt.subplot(236), plt.title("img1"), plt.imshow(cv.cvtColor(img1, cv.COLOR_BGR2RGB)) # 显示最终的合成图像(RGB格式)并展示所有图像以验证效果,最终的叠加效果可以通过查看"img1"(最后一个子图)来观察,可以看到logo完美地叠加到了另一张图片上,这种方法的关键在于正确设计掩码以及选择合适的阈值,通过调整掩码的阈值,可以控制哪些部分被保留或剔除,理解掩码的作用以及设计合适的阈值是使用
文章版权声明:除非注明,否则均为VPS857原创文章,转载或复制请以超链接形式并注明出处。
还没有评论,来说两句吧...