如何用python从大量图片中挑出特定图片制作延时摄影视频?

学了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) # 遍历视频目录中的图片,转视频