【问题标题】:How to overlay multiple images onto certain original images using python如何使用python将多个图像叠加到某些原始图像上
【发布时间】:2022-01-01 03:26:32
【问题描述】:

我正在尝试创建一个程序,在该程序中,我应该能够使用 python 和 opencv 将一个图像覆盖在另一个基本图像上,并将输出图像存储在另一个文件夹中。我正在使用 opencv 来实现这一点,但是我编写的代码没有给出预期的结果。

import cv2
from os import listdir
from os.path import isfile, join
import numpy as np

path_wf = 'wf_flare'
path_fr = 'captured_flare'

files_wf = [ f for f in listdir(path_wf) if isfile(join(path_wf,f))]
files_fr = [ fl for fl in listdir(path_fr) if isfile(join(path_fr,fl))]

img_wf = np.empty(len(files_wf), dtype = object)
img_fr = np.empty(len(files_fr), dtype = object)
img = np.empty(len(files_wf), dtype = object)
k = 0
for n in range(0, len(files_wf)):
    img_wf[n] = cv2.imread(join(path_wf, files_wf[n]))
    img_fr[k] = cv2.imread(join(path_fr, files_fr[k]))
    print("Done Reading"+str(n))
    img_wf[n] = cv2.resize(img_wf[n], (1024,1024),interpolation = cv2.INTER_AREA)

    

    img[n] = 0.4*img_fr[k] + img_wf[n]

    fn = listdir(path_wf)
    name = 'C:\Flare\flare_img'+str(fn[n])
    print('Creating...'+ name + str(n+10991))
    cv2.imwrite(name,img[n])
    k += 1
    if(k%255 == 0):
        k = 0
    else:
        continue

文件夹组织粘贴在下面:

我希望输出图像到这里:

【问题讨论】:

  • 我不知道这是否是您的问题,但不要使用反斜杠作为路径分隔符。如果你使用r'c:\strings\like\this',你实际上可以,但记住永远不要使用反斜杠要容易得多。你不需要它们。更好的是,继续阅读使用Pathlib

标签: python numpy opencv file-handling


【解决方案1】:

下面一行有两个问题:

name = 'C:\Flare\flare_img'+str(fn[n])
  1. 在 Python 中,字符串中的特殊字符使用反斜杠进行转义。一些示例是\n(换行符)、\t(制表符)、\f(换页)等。在您的情况下,\f 是导致路径格式错误的特殊字符。解决此问题的一种方法是通过在第一个引号前添加 r 来使用原始字符串:
'C:\Flare\flare_img'
Out[12]: 'C:\\Flare\x0clare_img'

r'C:\Flare\flare_img'
Out[13]: 'C:\\Flare\\flare_img'
  1. 在创建文件系统路径时不要只连接字符串。迟早你会放错路径分隔符。在这种情况下,它会丢失,因为fn[n] 不以 1 开头。假设fn[n] = "spam.png"。然后假设你这样做
name = r'C:\Flare\flare_img'+str(fn[n])

您对name 的价值将是

C:\\Flare\\flare_imgspam.png

这不是你想要的。

如前所述,使用os.path.join 或现代pathlib.Path。将fn[n] 包装在str 函数中也是多余的,因为os.listdir 已经返回了一个字符串列表。

您需要进行的更改如下:

# add to imports section
from pathlib import Path

# add before for-loop
out_path = Path(r'C:\Flare\flare_img')

# change inside for-loop
name = out_path / fn[n]

文档:Python Strings

【讨论】:

  • aaa 和反斜杠在普通字符串中具有特殊含义
  • @ChristophRackwitz 编辑解释了 OP 方法中的两个错误。
  • 如果问的不是太多,您能否更正您指出的代码行?另外,我在这里收到img[n] = 0.4*img_fr[k] + img_wf[n] 广播错误。
  • 错误信息是 ValueError: 操作数不能与形状一起广播 (752,1008,3) (1024,1024,3)
  • 添加了完整的pathlib 语法。关于广播错误,您的两个输入图像的大小似乎不同。我不确定如何针对您的问题域适当地调整它们。如果它们必须保持原始大小,则需要在更深层次(按像素)执行叠加操作。
猜你喜欢
  • 2019-11-24
  • 1970-01-01
  • 2021-01-26
  • 1970-01-01
  • 2012-09-19
  • 2020-07-22
  • 2020-02-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多