记录一些因为在网络训练,测试过程中经常用到的一些脚本
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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)