学了python两个月,碰到这个问题,钻研了两周没解决。
我用EVOS M7000 显微系统拍了一系列不同位置的细胞照片,时间间隔是45分钟。每次会拍几十个位置,并且同一个位置会生成不同类型的照片,比如原始照片(Raw),显示照片(Displayed),合并的照片(Merged)。会有荧光d1和白光d4两个不同的通道。同一位置根据照片的类型和通道生成视频。
一般文件名是这样的 scan Top Slide_D_p00_0_A01f01d4.TIF。 scan Top Slide_不重要,每次实验都是不同的,但是后面的相同。D:照片类型,还有R和M两种。p00代表时间点,接着是p01,p02,我的情况到p150。A01f01是位置信息,如果这六个一样,就是同一位置。最后的d4代表白光,还有d1代表荧光。我的思路是从后向前读文件名,将同一位置的比如A01f01挑出来,然后根据照片类型D,R或M再分类,然后根据通道,d1还是d4,生出视频。我目前就做到了第一步,从后向前读文件名,然后就不知道接下来怎么做了。
文件名中,单独的“0”表示什么
我这里没有图片,你自己测一下吧
提前安装好ffmpeg,配置环境变量,如果是windows系统,自己改一下代码。
如果报错格式问题,把图片转成png或jpeg试试。
#!/usr/bin/python3
import os
import shutil
# 问题来源:https://ask.csdn.net/questions/7477374
# 文件名示例:“scan Top Slide_D_p00_0_A01f01d4.TIF”
# scan Top Slide_ :可忽略部分
# D:照片类型。Raw-原始照片,Displayed-显示照片,Merged-合并后的照片
# p00:拍摄时间点。接着是p01,p02,最大到p150。
# A01f01:拍摄位置信息。如果这六个字符一样,表示图片拍摄了同一位置。
# 0:
# d4:拍摄方式。d4-白光,d1-荧光
# .TIF:文件类型
# 需求:同一位置的挑出来,然后根据照片类型分类,然后根据通道生出视频
# {
# "A01f01_raw_d1": [
# "/Users/abc/fdsh/scan Top Slide_R_p00_0_A01f01d1.TIF",
# "/Users/abc/fdsh/scan Top Slide_R_p01_0_A01f01d1.TIF",
# ...... ],
# "A01f01_raw_d4": [
# // img1, img2, ......]
# "A01f01_displayed_d1":[],
# "A01f01_displayed_d4":[],
# "A01f01_merged_d1":[],
# "A01f01_merged_d4":[],
# "B55fb9_raw_d1": [],
# ......
# }
#
def makeMovie(dir, framerate, rate):
folder = os.path.basename(dir)
os.chdir(dir)
command = "ffmpeg -framerate {} -f image2 -i ./*.TIF -vcodec libx264 -r {} {}.mp4".format(framerate, rate, folder)
# command = "ffmpeg.exe -framerate {} -f image2 -i ./*.TIF -vcodec libx264 -r {} {}.mp4".format(framerate, rate, folder) # win
os.system(command)
print("%s.mp4生成了" % folder)
def getMovieDirs(path):
dirs = []
files = os.listdir(path) # 得到全部图片
for file in files:
tname = file.replace("scan Top Slide_", "").replace(".TIF", "")
tarr = tname.split("_")
f_type = tarr[0] # 类型 R D M
f_time = tarr[1] # 拍摄时间-自增长的序号,无相关操作
f_zone = tarr[2] # 那个不明意义的“0”
f_addr_channel = tarr[3] # 拍摄位置 和 通道
f_addr = f_addr_channel[:6] # 拍摄位置
f_chnl = f_addr_channel[6:] # 通道 d1 d4
image_path = os.path.join(path, file) # 图片的绝对路径
movie_path = "{}_{}_{}".format(f_addr, f_type, f_chnl)
movie_path = os.path.join(path, movie_path) # 视频目录
os.makedirs(movie_path)
shutil.copyfile(image_path, movie_path) # 拷贝图片到视频目录
dirs.append(movie_path)
return dirs
path = "/Users/abc/fdsh/" # 工作目录。图片所在目录。理想状态:这个目录只有目标图片
framerate = 2 # 一张图片播放2秒
rate = 6 # 帧率。视频每秒播放帧数
if "__main__" == __name__:
dirs = getMovieDirs(path) # 全部视频目录
for dir in dirs:
makeMovie(dir, framerate, rate) # 遍历视频目录中的图片,转视频