【问题标题】:How to add images on top of each other in for loop?如何在for循环中相互叠加图像?
【发布时间】:2021-01-28 11:58:22
【问题描述】:

我有 4 张图片。我想获得 1 张图像,它是所有 4 张图像的叠加。 我的代码没有正确执行此操作。到目前为止,这是我的代码:

framefiles = [file for file in os.listdir(inputvideopath) if os.path.isfile(os.path.join(inputvideopath, file)) and file.endswith('jpg')]
for frame_id, frame in enumerate(framefiles):
    if frame_id < 1:
        img1 = cv2.imread(output_dir + frame)
    if frame_id >= 1:
        img2 = cv2.imread(output_dir + frame)
        final_img = cv2.add(img1,img2)
        cv2.imshow('hh',final_img)
        cv2.waitKey(0)

任何帮助将不胜感激。谢谢。

【问题讨论】:

  • 如何叠加?见cv2.addWeighted
  • 仅将所有图像叠加在一起即可获得 1 张最终图像。我不需要为每个图像添加特定的权重。我只需要创建一个 forloop 就可以了。因为将来我将有超过 4 张图像来制作叠加图像
  • 如果您将 4 张大小相同的图像叠放在一起,您只会看到最后一张图像。你想增加透明度还是不同尺寸的图像以及它们应该如何定位?请更精确并提供一些图片。

标签: python opencv add


【解决方案1】:

如果您不想处理精确的权重,最好不要使用循环。在每次迭代中,您都会按比例赋予新覆盖的图像过多的权重 w.r.t。到已经合并的图像。

让我们看看这四张图片:

我准备了一些代码来可视化:

import cv2
import numpy as np

images = ['1.png', '2.png', '3.jpg', '4.jpg']
images = [cv2.resize(cv2.imread(i), (400, 400)) for i in images]

# Don't do loops, m'kay?
output = images[0]
for i, image in enumerate(images[1:]):
    output = cv2.addWeighted(output, 0.5, image, 0.5, 0)
    cv2.imwrite(str(i) + '.png', output)

# Do linear blending using all images at once.
output = (np.array(images) / len(images)).sum(axis=0).astype(np.uint8)
cv2.imwrite('output.png', output)

循环的(中间)输出如下所示:

夜间图像最为突出,而帕丁顿熊则几乎看不到。

最好将所有图像除以要叠加的图像数量,然后将它们相加。使用 NumPy,这是给定的单行,这就是输出:

----------------------------------------
System information
----------------------------------------
Platform:      Windows-10-10.0.16299-SP0
Python:        3.8.5
NumPy:         1.19.5
OpenCV:        4.5.1
----------------------------------------

【讨论】:

  • 精选示例图片! ;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-03
  • 1970-01-01
相关资源
最近更新 更多