首页 > 解决方案 > 将图像与蒙版一起添加

问题描述

所以我目前有下面2张图片。这些是在图像的前景和背景部分使用神经风格转移网络获得的。

在此处输入图像描述 在此处输入图像描述

使用的代码如下:

add = cv2.add(image1, image2)
cv2.imshow('Addition', add)
cv2.waitKey(0)
cv2.destroyAllWindows()

我已将它们合并以创建以下结果图像:

在此处输入图像描述

但是,我想在获得的图片上使用显着性蒙版。显着面具在下面。我尝试将掩码参数输入到 add 函数但没有运气。我已经尝试查看这篇文章,但无法弄清楚该怎么做基于蒙版将 2 个图像添加到一起

在此处输入图像描述

编辑:

发现问题是我没有转换数据类型。更新后的代码是:

saliencyMap = cv2.resize(saliencyMap, (384,384))
newmap = saliencyMap.astype(np.uint8)
add = cv2.add(image1, image2, mask=newmap)
cv2.imshow('addition', add)
cv2.waitKey(0)

但是,生成的图像是,我不知道为什么:

在此处输入图像描述

标签: pythonopencvimage-processingstyle-transfer

解决方案


我认为您可能想要的只是将两个图像的大小调整为相同的大小,然后添加它们。然后使用遮罩在 Python/OpenCV 中进行强光合成。

图像1:

在此处输入图像描述

图像2:

在此处输入图像描述

掩码(显着性):

在此处输入图像描述

import cv2
import numpy as np

# read image 1
img1 = cv2.imread('img1.png')
hh, ww = img1.shape[:2]

# read image 2 and resize to same size as img1
img2 = cv2.imread('img2.png')
img2 = cv2.resize(img2, (ww,hh))

# read saliency mask as grayscale and resize to same size as img1
mask = cv2.imread('mask.png')
mask = cv2.cvtColor(mask, cv2.COLOR_BGR2GRAY)
mask = cv2.resize(mask, (ww,hh))

# add img1 and img2
img12 = cv2.add(img1, img2)

# get mean of mask and shift mean to mid-gray
# desirable for hard light compositing
# add bias as needed
mean = np.mean(mask)
bias = -32
shift = 128 - mean + bias
mask = cv2.add(mask, shift)
mask = cv2.merge([mask,mask,mask])

# threshold mask at mid gray and convert to 3 channels
# (needed to use as src < 0.5 "if" condition in hard light)
thresh = cv2.threshold(mask, 128, 255, cv2.THRESH_BINARY)[1]

# do hard light composite of img12 and mask
# see CSS specs at https://www.w3.org/TR/compositing-1/#blendinghardlight
img12f = img12.astype(np.uint8)/255
maskf =  mask.astype(np.uint8)/255
threshf =  thresh.astype(np.uint8)/255
threshf_inv = 1 - threshf
low = 2.0 * img12f * maskf
high = 1 - 2.0 * (1-img12f) * (1-maskf)
result = ( 255 * (low * threshf_inv + high * threshf) ).clip(0, 255).astype(np.uint8)

# save results
cv2.imwrite('img12_hardlight.png', result)

# show results
cv2.imshow('img12', img12)
cv2.imshow('mask', mask)
cv2.imshow('thresh', thresh)
cv2.imshow('result', result)
cv2.waitKey(0)
cv2.destroyAllWindows()

结果:

在此处输入图像描述


推荐阅读