【问题标题】:How to add (merge) multiple images in one directory如何在一个目录中添加(合并)多个图像
【发布时间】:2019-12-21 09:44:55
【问题描述】:

我在一个目录中有两种类型(A 和 B)的图像,我想像这样将它们添加在一起(而不是连接):

A1.jpeg + B1.jpeg = Merged1.jpeg
A2.jpeg + B2.jpeg = Merged2.jpeg
...
AN.jpeg + BN.jpeg = MergedN.jpeg

我不知道如何自定义我的代码,以便它适用于整个目录:

import cv2
import os

for i,filenames in os.walk('.'):
    A1 = cv2.imread('A1.jpeg',0)
    B1 = cv2.imread('B1.jpeg',0)
    image = cv2.add([A1,B1])
    filename = ('Merged' + {i} + '.jpeg')
    cv2.imwrite(filename, image)

有什么想法吗?谢谢

编辑:

我在 for 循环中添加了计数器,因为您无法像以前那样定义 for 循环。

import cv2
import os

i=0

for filenames in os.walk('.'):
    i = i + 1
    A = "A" + str(i) + ".jpeg"
    B = "B" + str(i) + ".jpeg"
    Ai = cv2.imread(A,0)
    Bi = cv2.imread(B,0)
    image = cv2.add([Ai,Bi])
    filename = ('Merged' + str(i) + '.jpeg')
    cv2.imwrite(filename, image)

但它只添加了 A1 和 B1。这是计算 for 循环的错误方法吗?

【问题讨论】:

  • 关于您的编辑,通过打印检查 A 和 B 是什么。即使 cv2 没有找到文件,它也会保持沉默。

标签: python opencv cv2 os.path


【解决方案1】:

只需使用自定义变量更改imread 中的文件名,您可以在其中使用i

A = "A" + str(i) + ".jpeg"
B = "B" + str(i) + ".jpeg"
Ai = cv2.imread(A,0)
Bi = cv2.imread(B,0)

我假设i 是一个数字。

【讨论】:

  • 我得到一个错误:for i,filenames in os.walk('.'): ValueError: too many values to unpack (expected 2) 你知道如何在 os.walk 中定义 i ()?
  • 您可以计算 os.walk 返回的列表并使用 range (count) for i 从中挑选数字。
【解决方案2】:

您可以使用glob,因为我认为它会更容易

import glob
for i, a_file in enumerate(glob.glob('./A*')):
    A = cv2.imread(a_file,0)
    B = cv2.imread(a_file.replace('A', 'B'),0)
    image = cv2.add([A,B])
    filename = ('Merged' + {i} + '.jpeg')
    cv2.imwrite(filename, image)

【讨论】:

  • 如何在 glob 中定义 {i}?
  • 我在移动设备上,但 enumerate 会返回两件事吗?一个给 i 一个给 a_file ?我想你忘了为文件名列表重复 glob。
  • @ankii enumrate 接受一个可交互对象,并返回索引,并在可迭代对象中以正确的顺序返回它自己的值
【解决方案3】:

我是这样解决的:

import glob
import cv2

number_of_images = 750

for a_file in glob.glob('./A*'):
    for i in range(1,number_of_images):
        A = "A" + str(i) + ".jpeg"
        B = "B" + str(i) + ".jpeg"
        A1 = cv2.imread(A,0)
        B1 = cv2.imread(B,0)
        image = cv2.add([A1,B1])
        filename = ('Merged' + str(i) + '.jpeg')
        cv2.imwrite(filename, image)
        print(i)
    if i==number_of_images-1:
        break   

感谢您的建议!

【讨论】:

  • 如果你有 750 作为所有图像的数量,你甚至不需要运行 glob。您在循环后面没有使用变量 a_file 。对@reznik?使用 750 运行循环,即只是内部循环。
猜你喜欢
  • 2015-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-02
  • 2015-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多