File size: 2,484 Bytes
caa56d6 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 |
import numpy as np
import cv2
def AlphaBlend(foreground, background, alpha):
# Convert uint8 to float
foreground = foreground.astype(float)
background = background.astype(float)
# Normalize the alpha mask to keep intensity between 0 and 1
alpha = alpha.astype(float)/255
if len(alpha.shape) < 3:
alpha = np.expand_dims(alpha, 2)
outImage = alpha * foreground + (1.-alpha) * background
outImage = np.clip(outImage, 0, 255).astype(np.uint8)
return outImage
def blendImages(src, dst, mask, featherAmount=0.1):
maskIndices = np.where(mask != 0)
maskPts = np.hstack(
(maskIndices[1][:, np.newaxis], maskIndices[0][:, np.newaxis]))
faceSize = np.max(maskPts, axis=0) - np.min(maskPts, axis=0)
featherAmount = 0.2
hull = cv2.convexHull(maskPts)
#hull = hull.astype(np.uint64)
dists = np.zeros(maskPts.shape[0])
for i in range(maskPts.shape[0]):
point = (maskPts[i, 0], maskPts[i, 1])
"""
The third paprameter can be set as "True" for more visually diverse images.
We use "False" to add imperceptible image patterns to synthesize new images.
"""
point_x, point_y = point
dists[i] = cv2.pointPolygonTest(hull, (int(point_x),int(point_y)), False)
weights = np.clip(dists / featherAmount, 0, 1)
composedImg = np.copy(dst)
composedImg[maskIndices[0], maskIndices[1]] = weights[:, np.newaxis] * \
src[maskIndices[0], maskIndices[1]] + \
(1 - weights[:, np.newaxis]) * \
dst[maskIndices[0], maskIndices[1]]
newMask = np.zeros_like(dst).astype(np.float32)
newMask[maskIndices[0], maskIndices[1]] = weights[:, np.newaxis]
return composedImg, newMask
def colorTransfer(src_, dst_, mask):
src = dst_
dst = src_
transferredDst = np.copy(dst)
maskIndices = np.where(mask != 0)
maskedSrc = src[maskIndices[0], maskIndices[1]].astype(np.int32)
maskedDst = dst[maskIndices[0], maskIndices[1]].astype(np.int32)
meanSrc = np.mean(maskedSrc, axis=0)
meanDst = np.mean(maskedDst, axis=0)
maskedDst = maskedDst - meanDst
maskedDst = maskedDst + meanSrc
maskedDst = np.clip(maskedDst, 0, 255)
transferredDst[maskIndices[0], maskIndices[1]] = maskedDst
return transferredDst
|