Python-深度学习常用脚本

记录一些因为在网络训练,测试过程中经常用到的一些脚本

1.视频按帧提取

可以从一段视频中截取不同帧的图片,并保存至文件夹。

需要自己更改视频路径和图片保存路径

import os
import cv2
import shutil
 
VIDEO_PATH = 'test.mp4'  # 视频地址
EXTRACT_FOLDER = 'video'  # 存放帧图片的位置
EXTRACT_FREQUENCY = 1  # 帧提取频率
 
def extract_frames(video_path, dst_folder, index):
    # 主操作
    video = cv2.VideoCapture()
    if not video.open(video_path):
        print("can not open the video")
        exit(1)
    count = 1
    while True:
        _, frame = video.read()
        if frame is None:
            break
        if count % EXTRACT_FREQUENCY == 0:
            save_path = "{}/{:>03d}.jpg".format(dst_folder, index)
            cv2.imwrite(save_path, frame)
            index += 1
        count += 1
    video.release()
    # 打印出所提取帧的总数
    print("Totally save {:d} pics".format(index - 1))
def main():
    # 递归删除之前存放帧图片的文件夹,并新建一个
    try:
        shutil.rmtree(EXTRACT_FOLDER)
    except OSError:
        pass
    if not os.path.exists(EXTRACT_FOLDER):
        os.mkdir(EXTRACT_FOLDER)
    # 抽取帧图片,并保存到指定路径
    extract_frames(VIDEO_PATH, EXTRACT_FOLDER, 1)
if __name__ == '__main__':
    main()

2.获取路径下的文件名

def getFiles(rootDir):
    files = []
    for lists in os.listdir(rootDir):
        path = os.path.join(rootDir, lists)
        files.append(path)
        # print(path)
        if os.path.isdir(path):
            getFiles(path)
    return files

3.删除文件夹下含有指定字符的文件

需要自己更改文件了路径,如果要删除的是某种格式的文件,比如在一堆混杂格式的文件夹中要删除jpg文件,就把下面的if条件换一下,如:

if(name.endswith(".jpg")):
import os
path = "urban"
n = 0
for root, dirs, files in os.walk(path):
    for name in files:
        if("SR"in name):
            n += 1
            print(n)
            print(name)
            os.remove(os.path.join(root, name))

4.裁剪指定区域

主要用于做实验对比,多张生成的图像需要进行图像的细节、纹理对比,因此截取这些图像的同一区域进行对比,需要更改的地方为输入/输出图像文件夹路径,origin/output,裁剪范围可以自行设定,也就是img变量的四个位置参数,对应为img[y1:y2,x1:x2]

import cv2
import os
import time


def get_img(input_dir):
    img_paths = []
    for (path,dirname,filenames) in os.walk(input_dir):
        for filename in filenames:
            img_paths.append(path+'/'+filename)
    print("img_paths:",img_paths)
    return img_paths


def cut_img(img_paths,output_dir):
    scale = len(img_paths)
    for i,img_path in enumerate(img_paths):
        a = "#"* int(i/1000)
        b = "."*(int(scale/1000)-int(i/1000))
        c = (i/scale)*100
        time.sleep(0.2)
        print('正在处理图像: %s' % img_path.split('/')[-1])
        img = cv2.imread(img_path)
        weight = img.shape[1]
        if weight>1600:
            cropImg = img[50:225, 700:1500]    # 裁剪[y1,y2:x1,x2]
            #cropImg = cv2.resize(cropImg, None, fx=0.5, fy=0.5,
                                 #interpolation=cv2.INTER_CUBIC) #缩小图像
            cv2.imwrite(output_dir + '/' + img_path.split('/')[-1], cropImg)
        else:
            cropImg_01 = img[0:100, 100:200]
            cv2.imwrite(output_dir + '/'+img_path.split('/')[-1], cropImg_01)
        print('{:^3.3f}%[{}>>{}]'.format(c,a,b))
    print('100%')
if __name__ == '__main__':
    output_dir = "output"           # 保存截取的图像目录
    input_dir = "origin"                # 读取图片目录表
    img_paths = get_img(input_dir)
    print('图片获取完成 。。。!')
    cut_img(img_paths,output_dir)

效果如下: 

 5.将图像裁剪为九宫格

这个就很简单了,将图像裁剪为九部分,需要改一下读入图像路径与保存路径就行。

import os
from PIL import Image
# 读取图片
im = Image.open('1.png')

# 宽高各除 3,获取裁剪后的单张图片大小
width = im.size[0]//3
height = im.size[1]//3

# 裁剪图片的左上角坐标
start_x = 0
start_y = 0

# 用于给图片命名
im_name = 1

# 循环裁剪图片
for i in range(3):
    for j in range(3):
        # 裁剪图片并保存
        crop = im.crop((start_x, start_y, start_x+width, start_y+height))
        # 判断文件夹是否存在
        if not os.path.exists('imgs'):
            os.mkdir('imgs')
        crop.save('imgs/' + str(im_name) + '.jpg')

        # 将左上角坐标的 x 轴向右移动
        start_x += width
        im_name += 1

    # 当第一行裁剪完后 x 继续从 0 开始裁剪
    start_x = 0
    # 裁剪第二行
    start_y += height

效果如下: 

6.低分辨图像生成

将初始高分辨图像HR生成低分辨图像LR,path_src为HR图像文件路径,path_save为保存生成LR图像的文件路径,缩放因子scale可以选择,这里设置的是从1.5倍开始,步进为0.5,到4倍截止。

function generate_LR_metasr_X1_X4()
%% settings
path_save = '';
path_src = '';
ext               =  {'*.png'};
filepaths           =  [];
for i = 1 : length(ext)
    filepaths = cat(1,filepaths, dir(fullfile(path_src, ext{i})));
end
nb_im = length(filepaths);
DIV2K_HR = [];

for idx_im = 1:nb_im
    fprintf('Read HR :%d\n', idx_im);
    ImHR = imread(fullfile(path_src, filepaths(idx_im).name));
    DIV2K_HR{idx_im} = ImHR;
end
FolderLR_bicubic = fullfile(path_save,'LR_bicubic')
if ~exist(FolderLR_bicubic)
    mkdir(FolderLR_bicubic)
end
    
%% generate and save LR via imresize() with Bicubic
for scale=1.5:0.5:4
    FolderLR = fullfile(path_save,'LR_bicubic', sprintf('X%.2f',scale));
    
    if ~exist(FolderLR)
        mkdir(FolderLR)
    end
    for IdxIm = 1:nb_im
        fprintf('IdxIm=%d\n', IdxIm);
        ImHR = DIV2K_HR{IdxIm};
        [h,w,n]=size(ImHR);
        if mod(h,scale) ~= 0
            h = h - 4;
        end
        if mod(w,scale) ~= 0
            w = w - 4;
        end
        ImHR =ImHR(1:h,1:w,:);
        ImLR = imresize(ImHR, 1/scale, 'bicubic');
        % name image
        fileName = filepaths(IdxIm).name
        NameLR = fullfile(FolderLR, fileName);
        % save image
        imwrite(ImLR, NameLR, 'png');
    end
end
end

 

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值