如何使用 python 将多个图像叠加到某些原始图像上
How to overlay multiple images onto certain original images using python
我正在尝试创建一个程序,在该程序中我应该能够使用 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
文件夹组织粘贴如下:
我要输出图片到这里:
下一行有两个问题:
name = 'C:\Flare\flare_img'+str(fn[n])
- 在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'
- 创建文件系统路径时不要只是连接字符串。迟早你会放错路径分隔符。在这种情况下,它会丢失,因为
fn[n]
不是以 one 开头的。假设 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
已经 returns 一个字符串列表。
您需要做的修改如下:
# 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]
文档:PythonStrings
我正在尝试创建一个程序,在该程序中我应该能够使用 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
文件夹组织粘贴如下:
我要输出图片到这里:
下一行有两个问题:
name = 'C:\Flare\flare_img'+str(fn[n])
- 在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'
- 创建文件系统路径时不要只是连接字符串。迟早你会放错路径分隔符。在这种情况下,它会丢失,因为
fn[n]
不是以 one 开头的。假设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
已经 returns 一个字符串列表。
您需要做的修改如下:
# 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]
文档:PythonStrings