Это довольно сложный процесс, в основном потому, что есть несколько шагов, чтобы добавить изображение поверх изображения другого размера.Я советую вам проверить все промежуточные шаги в коде ниже, чтобы понять, что происходит.
Я использовал HSV-цветовое пространство для отделения подписи от фона, это легко адаптировать, если подпись или фон имеют другие цвета.
Я не нашел привязок Python для copyTo()
-метод, используемый @BahramdunAdil.Вместо этого вы можете использовать numpy.copyto()
функциональность.Для этого я отсылаю вас к этому ответу .
Я использовал другую технику: чтобы добавить изображение поверх другого, сначала создается подизображение того же размера, что и подпись.Подпись может быть добавлена к подизображению, которое затем помещается обратно в основное изображение.
Кроме того, вы можете взять пороговую подпись и использовать метод @ renedv1 для сохранения альфа-изображения.Для этого используйте изображение sign_masked
.Благодаря HSV-диапазону вы можете добиться более чистого результата.(Примечание: учтите тот факт, что sign_masked имеет черный фон)
Результат:
Код:
import numpy as np
import cv2
# load image
sign = cv2.imread("sign.jpg")
bg_img = cv2.imread("green_area.jpg")
# Convert BGR to HSV
hsv = cv2.cvtColor(sign, cv2.COLOR_BGR2HSV)
# define range of HSV-color of the signature
lower_val = np.array([0,0,0])
upper_val = np.array([179,255,150])
# Threshold the HSV image to get a mask that holds the signature area
mask = cv2.inRange(hsv, lower_val, upper_val)
# create an opposite: a mask that holds the background area
mask_inv= cv2.bitwise_not(mask)
# create an image of the signature with background excluded
sign_masked = cv2.bitwise_and(sign,sign,mask=mask)
# get the dimensions of the signature
height, width = sign.shape[:2]
# create a subimage of the area where the signature needs to go
placeToPutSign = bg_img[0:height,0:width]
# exclude signature area
placeToPutSign_masked = cv2.bitwise_and(placeToPutSign, placeToPutSign, mask=mask_inv)
# add signature to subimage
placeToPutSign_joined = cv2.add(placeToPutSign_masked, sign_masked)
# put subimage over main image
bg_img[0:height,0:width] = placeToPutSign_joined
# display image
cv2.imshow("result", bg_img)
cv2.waitKey(0)
cv2.destroyAllWindows()