【发布时间】:2020-11-09 13:58:55
【问题描述】:
【问题讨论】:
-
可能是opencv
-
stackoverflow.com/questions/34458251/… - 这是你的问题的答案吗?
标签: python matplotlib data-visualization visualization
【问题讨论】:
标签: python matplotlib data-visualization visualization
作为评论,链接的 awnser Plot over an image background in python 展示了如何使用 matplotlib 在现有图像上绘制简单的几何图形。如果你想要更复杂的东西(也可能随着时间的推移而改变)matplotlib 可以工作,但可能不会按你的意愿执行,并且包含很多你想要覆盖的所有元素的代码。
相反,您应该将叠加层作为图像提供并使用opencv 旋转它,并且叠加层是矩阵。
我给你举个简单的例子:
这里有背景图片:
我们要覆盖以下圆圈:
还有这个十字,但是旋转了 36 度:
以下代码将提供想要的结果:
import cv2
import numpy as np
def rotate_image(image, angle):
image_center = tuple(np.array(image.shape[1::-1]) / 2)
rot_mat = cv2.getRotationMatrix2D(image_center, angle, 1.0)
result = cv2.warpAffine(image, rot_mat, image.shape[1::-1], flags=cv2.INTER_LINEAR)
return result
def overlay_images(img1, img2):
if img1.shape[2] != 4 or img2.shape[2] != 4:
print('png needs Alphachannel!')
return
alpha_img1 = img1[:,:,3] / 255.0
alpha_img2 = img2[:,:,3] / 255.0
for color in range(0, 3):
img1[:,:,color] = alpha_img2 * img2[:,:,color] + \
alpha_img1 * img1[:,:,color] * (1 - alpha_img2)
img1[:,:,3] = (1 - (1 - alpha_img2) * (1 - alpha_img1)) * 255
return img1
img_bg = cv2.imread('img1.png',cv2.IMREAD_UNCHANGED)
img_circle = cv2.imread('img2.png',cv2.IMREAD_UNCHANGED)
img_cross = cv2.imread('img3.png',cv2.IMREAD_UNCHANGED)
img_rotate_36 = rotate_image(img_cross, 36)
img1_2 = overlay_images(img_bg, img_circle)
img1_2_3 = overlay_images(img1_2, img_rotate_36)
cv2.imwrite('img_rotated.png', img1_2_3)
cv2.imshow('Rotatet Image', img1_2_3)
cv2.waitKey(0)
cv2.destroyAllWindows()
有趣的部分是旋转和叠加。我将这种情况用于覆盖此解决方案https://stackoverflow.com/a/59211216/10985257,因为cv2.addWeighted 函数似乎与alpha 通道有问题。使用的算法称为阿尔法合成。旋转基于https://stackoverflow.com/a/9042907/10985257,是基于旋转矩阵的简单仿射变换。
我将这两个应用程序都放在了上面代码中的一个函数中。
【讨论】: