将图像的一部分叠加到另一图像上
overlay one part of image onto another image
对应的图片有两张,第二张反映了第一张的遮罩区域。
如何将第二张图的红色区域叠加到第一张图上?
你可以用 OpenCV 这样做:
#!/usr/local/bin/python3
import numpy as np
import cv2
# Load base image and overlay
base = cv2.imread("image.jpg", cv2.IMREAD_UNCHANGED)
over = cv2.imread("overlay.jpg", cv2.IMREAD_UNCHANGED)
# Anywhere the red channel of overlay image exceeds 127, make base image red
# Remember OpenCV uses BGR ordering, not RGB
base[over[...,2]>127] = [0,0,255]
# Save result
cv2.imwrite('result.jpg',base)
如果您想在保留底层图像结构的同时混合一小部分红色(比如 20%),您可以这样做:
#!/usr/local/bin/python3
import numpy as np
import cv2
# Load base image and overlay
base = cv2.imread("image.jpg", cv2.IMREAD_UNCHANGED)
over = cv2.imread("overlay.jpg", cv2.IMREAD_UNCHANGED)
# Blend 80% of the base layer with 20% red
blended = cv2.addWeighted(base,0.8,(np.zeros_like(base)+[0,0,255]).astype(np.uint8),0.2,0)
# Anywhere the red channel of overlay image exceeds 127, use blended image, elsewhere use base
result = np.where((over[...,2]>127)[...,None], blended, base)
# Save result
cv2.imwrite('result.jpg',result)
顺便说一句,你实际上不需要任何 Python,你可以在终端中使用 ImageMagick 像这样:
magick image.jpg \( overlay.jpg -fuzz 30% -transparent blue \) -composite result.png
关键字:Python,图像处理,叠加,遮罩。
对应的图片有两张,第二张反映了第一张的遮罩区域。
如何将第二张图的红色区域叠加到第一张图上?
你可以用 OpenCV 这样做:
#!/usr/local/bin/python3
import numpy as np
import cv2
# Load base image and overlay
base = cv2.imread("image.jpg", cv2.IMREAD_UNCHANGED)
over = cv2.imread("overlay.jpg", cv2.IMREAD_UNCHANGED)
# Anywhere the red channel of overlay image exceeds 127, make base image red
# Remember OpenCV uses BGR ordering, not RGB
base[over[...,2]>127] = [0,0,255]
# Save result
cv2.imwrite('result.jpg',base)
如果您想在保留底层图像结构的同时混合一小部分红色(比如 20%),您可以这样做:
#!/usr/local/bin/python3
import numpy as np
import cv2
# Load base image and overlay
base = cv2.imread("image.jpg", cv2.IMREAD_UNCHANGED)
over = cv2.imread("overlay.jpg", cv2.IMREAD_UNCHANGED)
# Blend 80% of the base layer with 20% red
blended = cv2.addWeighted(base,0.8,(np.zeros_like(base)+[0,0,255]).astype(np.uint8),0.2,0)
# Anywhere the red channel of overlay image exceeds 127, use blended image, elsewhere use base
result = np.where((over[...,2]>127)[...,None], blended, base)
# Save result
cv2.imwrite('result.jpg',result)
顺便说一句,你实际上不需要任何 Python,你可以在终端中使用 ImageMagick 像这样:
magick image.jpg \( overlay.jpg -fuzz 30% -transparent blue \) -composite result.png
关键字:Python,图像处理,叠加,遮罩。