问题描述
我编写了一个模块,该模块将目录中的所有TIFF图像取走,对每个图像文件中的所有帧取平均,然后将平均后的图像保存到outputPath
指定的自动生成的子目录中:
def average_tiff_frames(inputPath):
'''
This function opens all TIFF image files in a directory,averages over all frames within each TIFF file,and saves the averaged images to a subdirectory.
Parameters
----------
inputPath : string
Absolute path to the raw TIFF files
'''
import datetime
import os
import numpy as np
from PIL import Image
# Read image file names,create output folder
while True:
try:
inputPath = os.path.join(inputPath,'') # Add trailing slash or backslash to the input path if missing
filenames = [filename for filename in os.listdir(inputPath)
if filename.endswith(('.tif','.TIF','.tiff','.TIFF'))
and not filename.endswith(('_avg.tif'))]
outputPath = os.path.join(inputPath,datetime.datetime.Now().strftime('%Y%m%dT%H%M%s'),'')
os.mkdir(outputPath)
break
except FileNotFoundError:
print('TIFF file not found - or - frames in TIFF file already averaged (file name ends with "_avg.tif")')
# Open image files,average over all frames,save averaged image files
for filename in filenames:
img = Image.open(inputPath + filename)
width,height = img.size
NFrames = img.n_frames
imgArray = np.zeros((height,width)) # Ordering of axes: img.size returns (width,height),np.zeros takes (rows,columns)
for i in range(NFrames):
img.seek(i)
imgArray += np.array(img)
i += 1
imgArrayAverage = imgArray / NFrames
imgAverage = Image.fromarray(imgArrayAverage)
imgAverage.save(outputPath + filename.rsplit('.')[0] + '_avg' + '.tif')
img.close()
return outputPath
print('Averaged TIFF images have been saved to ' + outputPath + '. The output path is returned as a string to the variable "outputPath".')
执行模块后,我希望outputPath
(即分配给它的字符串)可用于后续步骤。但是,当做
average_tiff_frames(inputPath)
print(outputPath)
我收到以下错误:
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
<ipython-input-5-99d0a947275c> in <module>()
1 inputPath = '/home/user/Desktop/data/'
2 average_tiff_frames(inputPath)
----> 3 print(outputPath)
NameError: name 'outputPath' is not defined
这是什么问题?
我首先想到的是outputPath
是while True: try
循环的局部变量,并且在break
之后被销毁,所以我在循环之前实例化了一个空字符串outputPath = ''
,但这没有帮助。
解决方法
您不是要在循环外访问变量,而是要完全在方法之外访问它。方法返回您要查找的值,因此将该值设置为变量:
outputPath = average_tiff_frames(inputPath)
print(outputPath)
或者直接打印:
print(average_tiff_frames(inputPath))