目录
背景
超分辨率重建任务首先需要高清图像。由于需要自己制作超分辨率重建数据集,我从pdf中获取我想要得图像,我根据网上代码进行了改造
可运行代码如下:(注意修改最后两行中的pdf路径和保存结果路径)
代码
#coding=utf-8
import os
import fitz
from os.path import abspath, dirname
# 使用fitz 库直接提取pdf的图像
# 参数: pdf 源pdf文件完整路径
# 参数: picPath 提取图像的路径
def muExtractImages(pdf, picPath):
pdfsplit = os.path.split(pdf) # 分离出文件名和路径
pdfname = pdfsplit[-1] # 获取文件名
pdfsplit1 = os.path.splitext(pdfname)
pdfname1 = pdfsplit1[0] # 获取不带扩展名的文件名
# print(pdfsplit)
# print(pdfname)
# print(pdfname1)
# 打开pdf,打印PDF的相关信息
doc = fitz.open(pdf)
# 图片计数
imgcount = 0
lenXREF = doc.xref_length() # 获取pdf文件对象总数
# 打印PDF的信息
print("文件名:{}, 页数: {}, 对象: {}".format(pdf, len(doc), lenXREF - 1))
# 遍历doc,获取每一页
for page in doc:
try:
imgcount += 1
tupleImage = page.get_images()
lstImage = list(tupleImage)
xref0 = lstImage[0] # 取第一个元组
xref1 = list(xref0) # 元组转化为列表
xref = xref1[0] # 最终取得xref ok
print("imgID: %s" % imgcount)
print("xref: %s" % xref)
img = doc.extract_image(xref) # 获取文件扩展名,图片内容 等信息
imageFilename = ("%s-%s." % (imgcount, xref) + img["ext"])
imageFilename = pdfname1 + "_" + imageFilename # 合成最终 的图像的文件名
imageFilename = os.path.join(picPath, imageFilename) # 合成最终图像完整路径名
print(imageFilename)
imgout = open(imageFilename, 'wb') # byte方式新建图片
imgout.write(img["image"]) # 当前提取的图片写入磁盘
imgout.close
except:
continue
if __name__ == '__main__':
current_path = abspath(dirname(__file__)) # 获取当前目录
pdf = r"C:\Users\Administrator\Desktop\test.pdf') ####待提取的pdf
muExtractImages(pdf, r"C:\Users\Administrator\Desktop\result") ###提取出的图片保存路径
其他
可以对主函数进行修改,对多个文件进行提取并保存。
超分辨率重建数据集制作:生成低分辨率数据集:
另外我对提取的图片进行了裁剪过滤操作,以适应超分辨率高清图像得要求,具体见我的博客
我进一步增添了一些功能,将pdf和图像进行互相转换,解决有时pdf无法提取图片的问题,如下。