2018-01-17 09:42:30 u014249958 阅读数 19299

前言

最近在写论文,使用word进行编辑,论文中包含大量图片,在将word转存成pdf后发现图片出现严重失真。在查阅大量资料并实践之后,终于找到了理想的解决方法。

方案

1.对图片的处理

论文中使用的图片是matlab跑出来的结果,我需要对它进行一定的组合编辑。以下是我使用的处理方法:对于matlab跑出的fig图像,另存为pdf格式,使用Adobe Acrobat Pro软件打开,点击左上角工具-裁剪,将图片的白边去掉,然后另存为tif格式。具体效果如下:
这里写图片描述
这里写图片描述

2、图片组合

在这里,我使用PPT进行图片组合。新建一个PPT, 将上一步处理好的tif图片复制到PPT中,对图片大小进行合理的缩放,然后将不同的图片组合成自己需要的模式,选中组合好的图片,右键点击组合-组合,然后右键点击另存为图片,存成增强型Windows元文件(emf)格式。PPT中图片的组合效果如下所示:
这里写图片描述

3、word的设置

首先打开word, 点击文件-选项-高级,在图像大小和质量那里勾选不压缩文件中的图像。然后将上一步保存的emf图像复制到word中,调整成自己需要的大小格式,最后以打印的方式生成pdf,具体设置方法如下:点击文件-打印-打印机属性-Adobe PDF设置-默认设置处点击编辑,进行如下图所示的参数设置:
这里写图片描述
这里可以根据自己的需要进行调整,然后点击另存为,保存下这个设置以便之后使用。点击确定回退到上一个界面,再次点击确定回退,之后点击打印,生成的pdf图片清晰,且数据量也不是很大。
在编辑过程中还遇到一个问题,发现生成的pdf页边距变大了。解决的办法是word中点击文件-选项-高级,打印那里取消勾选缩放内容以适用纸张大小选项。
OK,以上就是我在实践中总结出来的方法。

2020-01-16 14:10:25 mnrssj 阅读数 69

PDF、Word、HTML、XPS等是我们日常工作中常用到的文件格式,不同的场合会用到不同的文件格式展现,那么格式之间的转化就显得尤其重要。对于开发人员来说,在程序中接入格式转换功能也是常见的。

有时候我们需要在Java中将Word转换为图像格式,小编为您推荐文档处理套包Spire.Office for Java,您的办公文档开发专家。其中包含了Spire.Doc for Java, Spire.XLS for Java,Spire.Presentation for Java, Spire.PDF for Java 和 Spire.Barcode for Java,可满足多种文件格式的需求。

如果你想在Java中将Word文件转换为图像,你可以使用Spire.Doc for Java,下面的代码片段演示了如何使用Spire.Doc for Java将Word文档转换为图像文件。

将整个文档转换为多个图像

<font style="vertical-align: inherit;"><font style="vertical-align: inherit;">//创建一个Document对象</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

Document doc = new Document();</font></font><font></font>

<font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

//加载一个Word文件</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

doc.loadFromFile(“ C:\\ Users \\ Administrator \\ Desktop \\ sample.docx”);</font></font><font></font>

<font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

//循环浏览页面</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

for(int i = 0; i <doc.getPageCount(); i ++){</font></font><font></font>

<font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

    //将特定页面保存到BufferedImage</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

    BufferedImage image = doc.saveToImages(i,ImageType.Bitmap);</font></font><font></font>

<font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

    //将图像数据写入.png文件</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

    File file = new File(“ output /” + String.format((“ Img-%d.png”),i));</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

    ImageIO.write(image,“ PNG”,文件);</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

}</font></font><font></font>

将特定页面转换为图像

<font style="vertical-align: inherit;"><font style="vertical-align: inherit;">//创建一个Document对象</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

Document doc = new Document();</font></font><font></font>

<font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

//加载一个Word文件</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

doc.loadFromFile(“ C:\\ Users \\ Administrator \\ Desktop \\ sample.docx”);</font></font><font></font>

<font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

//将第一页保存到BufferedImage</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

BufferedImage image = doc.saveToImages(0,ImageType.Bitmap);</font></font><font></font>

<font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

//将图像数据写入.png文件</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

File file = new File(“ output / ToPNG.png”);</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

ImageIO.write(image,“ PNG”,文件);</font></font><font></font>

如果你想在Java中将PDF文件转换为图像,你可以使用Spire.PDF for Java,下面的代码片段演示了如何使用Spire.PDF for Java将Word文档转换为图像文件。

通过将Spire.PDF用于JAVA,我们可以在JAVA应用程序中轻松地将PDF文档的任何特定页面转换为BMP和图元文件图像。下面的示例演示如何在JAVA中将PDF转换为图像。支持的图像可以是Jpeg,Jpg,Png,Bmp,Tiff,Gif,EMF格式等。

<font style="vertical-align: inherit;"><font style="vertical-align: inherit;">导入java.awt.image.BufferedImage;</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

导入java.io.File;</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

导入java.io.IOException;</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

导入com.spire.pdf.PdfDocument;</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

导入javax.imageio.ImageIO;</font></font><font></font>

<font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

公共类toImage {</font></font><font></font>

<font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

        公共静态void main(String [] args)引发IOException {</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

            //加载样本PDF</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

            PdfDocument doc =新的PdfDocument();</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

            doc.loadFromFile(“ Sample.pdf”);</font></font><font></font>

<font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

            //将每个PDF保存为.png图像</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

            BufferedImage图片;</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

            for(int i = 0; i <doc.getPages()。getCount(); i ++){</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

                图片= doc.saveAsImage(i);</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

                File file = new File(String.format(“ ToImage-img-%d.png”,i));</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

                ImageIO.write(image,“ PNG”,文件);</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

            }</font></font><font></font>

<font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

            doc.close();</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

        }</font></font><font></font>

<font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">

}</font></font><font></font>
2018-11-16 22:25:39 q1138266752 阅读数 65

PDF文档

  1. PDF: protable Document Format 便携式文本格式
    用于处理PDF的模块是PyPDF2
    该模块只能从文件中提取文本,并将文本返回为Python字符串,不能提取图像,图表或者其他媒体。
    
    import PyPDF2
    import os
    
    current_path = os.getcwd()
    file_path = current_path + '/learning_python.pdf'
    pdf_file_obj = open(file_path, 'rb')  # 打开文件
    pdf_reader = PyPDF2.PdfFileReader(pdf_file_obj) #获取pdf的对象
    print(pdf_reader.numPages) # 获取所有的页码
    
    page_obj = pdf_reader.getPage(2) # 获取指定页码内容,从0开始
    print(page_obj)
    tmp = page_obj.extractText() # 提取文本内容,返回文本字符串
    print(tmp)
    但是返回的数据并不是完美的,有些格式会被删除
  2. 解密PDF:部分文档进行加密。
    所有的pdfFileReader对象都有一个isEncrypted属性,如果文档是加密的,它返回True , 调用decrypt()函数,传入密码作为参数。decrypt()函数只是解密PdfFileReader对象,不是实际文件,在硬盘中存储的文件还是加密的。
  3. 与读对象对应的是PdfFilterWriter对象,用来创建一个新的PDF文件,写入的文本仅限于从其他PDF中拷贝,旋转页面,重叠页面和加密文件, 不允许直接编辑PDF文件,必须从一个PDF文件中拷贝出来创建一个新的PDF文件。
    要生成实际的文件,需要调用PdfFilterWriterr对象的write()方法, 该方法接受一个普通的File对象,以二进制的模式打开,然后写入。
  4. PyPDF2,实现从一个PDF文档拷贝页面到另一个PDF文档。用于组合多个PDF文档,祛除不想要的页面,或者调整页面的次序。PyPDF2不能在PdfFileWriter对象中间插入页面,addPage()方法只能够在末尾添加页面。
  5. 利用rotateClockwise():顺时针旋转和rorateCounterClockwise():逆时针旋转;上述两个方法可以实现pdf页面选装90度的整数倍。传入的参数为90的整数倍数;
  6. PyPDF2可以将一页内容叠加到另一页上面去,用来在页面上添加公式标志,时间戳,logog,防伪标识等水印信息。
  7. 在调用PdfFileReader对象的writer()方法之前,调用该对象的encrypt(‘密码字符串’)方法,可以对pdf文档进行加密

Word文档

  1. 利用python-docx模块,python可以创建和修改Word文档,pip install python-docx
  2. docx文档结构较为复杂,这些结构在python-docx中用3种不同的类型来表示,在最高一层,Document对象表示整个文档,该对象包含一个Paragraph对象的列表,表示文档中的段落(按下回车,新的段落),每个Paragraph 对象都汉堡一个Run对象的列表。
    word文档中的文本不仅仅包含字符串,还包含与之相关的字体,大小,颜色和其他样式信息。样式是这些属性的集合,一个Run对象是相同样式文本的延续,当文本的样式发生裱花,就需要一个新的Run对象。
  3. import docx, os
    
    current_path = os.getcwd()
    print(current_path)
    file_path = current_path + '\word_test.docx'  
    print(file_path)
    
    doc = docx.Document(file_path) # 返回一个对象
    print(len(doc.paragraphs))  #获取长度
    
    print(doc.paragraphs[0].text)# 获取第一行的文本
    print(doc.paragraphs[1].text)
    print(doc.paragraphs[2].text)
    print(doc.paragraphs[3].text)
    
    print(len(doc.paragraphs[1].runs))# 获取第一个对象的文本长度
    
    print(doc.paragraphs[1].runs[0].text) # 获取第一个对象的文本字符串
    print(doc.paragraphs[1].runs[1].text)
    print(doc.paragraphs[1].runs[2].text)
    print(doc.paragraphs[1].runs[3].text)
    
    结果是:
    6
    Document title: test file
    1A plain paragraph with some bold and some italic
    2A plain paragraph with some bold and some italic
    
    4
    1A plain paragraph with some 
    bold
     and some
     italic
    

     

  4. 获取完整的文本, getText()函数
    传入文件名

    def getText(filename):
        doc = docx.Document(filename)
        fullText = []
        for para in doc.paragraphs:
            fullText.append(para.text)
        return '\n'.join(fullText)
    
    
    tmp_text = getText(file_path)

    返回内容字符串列表

  5. 设置Paragraph和Run对象的样式
    word文档中有3种类型的样式:
    段落样式可以应用于Paragraph对象;
    字符样式可以应用于Run对象;
    链接样式应用于上述两种对象;

  6. 创建新的word对象
     

    doc = docx.Document() # 返回一个新的word document对象
    doc.add_paragraph('hello this is the fitst wrod by python docx model') # 添加一段文本
    doc.save(current_path + '/hell_word.docx') # 保存文本到文件中

    再次调用add_paragraph()方法添加新段落
    调用add_run()方法向末尾添加文本;
    调用 add_heading(‘标题名称’, num:样式)将添加一个段落,并使用一种标题样式

 

 

2019-12-19 11:14:43 sgcwudi 阅读数 3

图片处理

用Pillow操作图像
Pillow是python著名图像处理库PIL的分支

#测试颜色pillow
import PIL
from PIL import  Image, ImageFilter
def main():
	image = PIL.Image.open('70_2476.jpg')
	print(image.size,image.format,image.mode)
	#裁剪图片
	#(距离左侧像素,距离上侧像素,左侧像素+截取图片宽度,上侧像素+截取图片宽度)
	#即(left,left+width,top,top+height)
	#j截取距离左侧200,宽度是700,距离上侧100,宽度是600
	rect = (400,200,600,600)
	image_suo =  image.crop(rect)
	image_suo.save('70_2476_caijian.jpg')
	#缩略图
	size = 400,200
	image.thumbnail(size)
	image.save('70_2476_suolue.jpg')

	#黏贴图像
	image2 = PIL.Image.open('70_1100.jpg')
	#将image_suo粘贴在image2,距离左侧200,距离上侧200的位置
	image2.paste(image_suo,(200,100))
	image2.save('70_1100_zhantie.jpg')
	#旋转
	#旋转180度
	image2_xuanzhuan = image2.rotate(180)
	image2_xuanzhuan.save('70_1100_xuanzhuan.jpg')
	#翻转图像FLIP_TOP_BOTTOM上下翻转,FLIP_LEFT_RIGHT左右反转
	image2_fanzhuan = image2.transpose(Image.FLIP_TOP_BOTTOM)
	image2_fanzhuan.save('70_1100_fanzhuan.jpg')
	#操作像素
	#putpixel()在指定的坐标处,指定颜色rgb
	for x in range(200,250):
		for y in range(300,350):
			image2_fanzhuan.putpixel((x, y), (255, 210, 128))
	image2_fanzhuan.save('image2_fanzhuan_pixel.jpg')
	#各种滤镜ImageFilter.BLUR,ImageFilter.CONTOUR,ImageFilter.DETAIL
	image2_fanzhuan.filter(ImageFilter.CONTOUR).save('image2_fanzhuan_lvjing.jpg')
if __name__ == '__main__':
	main()

python处理excel

有很多第三方包,如xlrd,xlwt,openpyxl等。

xlrd,xlwt支持老版本的excel,具体是支持2003年以前的excel,老版本excel行数,列数有最大值限制,不能写入超过65535行、256列的数据。

import xlrd
def main():
	#打开工作表,创建对象
	wb = xlrd.open_workbook('filpath')
	#返回工作表中所有的工作簿,可以通过索引调用
	sheetLst = wb.sheets()
	sheet1 = wb.sheet_by_index(0)
	sheet2 = sheetLst[0]
	#返回工作表中所有的工作簿名称,可以通过名称调用
	sheetNameLst = wb.sheet_names()
	sheet3= wb.sheet_by_name()

	#获取工作簿的行数和列数
	nrows = sheet1.nrows
	ncols = sheet1.ncols

	#获取某一行或者某一列的数据
	#rowNum:行号,startRow:开始行,endRow:结束航
	rowData  = sheet1.row_values('rowNum','startRow','endRow')
	colData = sheet1.col_values('colNum','startCol','endCol')

	#操纵单元格
	for row in sheet1.nrows:
		for col in sheet1.ncols:
			print(sheet1.cell(row,col).value)


if __name__ == '__main__':
	main()

xlwt

import xlwt
def main():
	#创建工作表
	wb = xlwt.Workbook()
	#添加工作簿cell_overwrite_ok参数控制是否可以对同一单元格重复操作覆盖等。
	sheet = wb.add_sheet('sheetName',cell_overwrite_ok=True)
	#给单元格赋值
	sheet.write('rowNum','colNum','value')
	#保存工作表,只能保存成xls,不能xlsx
	wb.save('fileName.xls')


if __name__ == '__main__':
	main()

openpyxl

#注意openpyxl的行,列的起始索引都是1。
import openpyxl
def main():
	#打开工作表
	wb = openpyxl.load_workbook('filepath')
	#获取工作簿列表或者名字
	sheets = wb.worksheets
	sheetNames = wb.sheetnames
	#get_sheet_names(),get_sheet_by_name()已经不建议使用
	#某一个工作簿
	sheet = sheets[0]
	sheet1 = wb[sheetNames[0]] #通过工作簿名字
	#最大行,最小行
	rows = sheet1.max_row
	cols = sheet1.max_column
	#按行获取单元格对象,所有单元格。相当于iter_rows()
	rowCells= sheet1.rows
	for cellRow in rowCells:
		print(','.join([cell.value  for cell in cellRow]))
	#按行获取单元格
	cells = sheet1.iter_rows('min_row','max_row','min_col','max_col')
	#按列获取单元格
	sheet1.iter_columns('min_row','max_row','min_col','max_col')
	for cellRow in cells:
		print(cellRow	)

	#操作单元格,
	value = sheet1.cell(row=1,column=2).value
	wb = openpyxl.Workbook()
	sheet = wb.create_sheet('tile',index)
	#单元格赋值
	sheet.cell(row=2,column=5).value = 5
	#逐行写,添加一行到当前sheet的最底部(即逐行追加从第一行开始) iterable必须是list,tuple,dict,range,generator类型的。 1,如果是list,将list从头到尾顺序添加。 2,如果是dict,按照相应的键添加相应的键值。
	#sheet.append(iterable)
	sheet.append(['This is A1', 'This is B1', 'This is C1'])
	sheet.append({'A': 'This is A1', 'C': 'This is C1'})
	sheet.append({1: 'This is A1', 3: 'This is C1'})
	wb.save('balances.xlsx')
xlrd xlwt openpyxl
打开或创建工作表 wb= open_workbook(filepath) wb= Workbook(filepath) wb= load_workbook(filepath)或Workbook(filepath)
获取所有工作簿 wb.sheets()或wb.sheet_names() 属性不是方法 wb.worksheets, wb.sheetnames
获取或添加工作簿 wb.sheets()[0]、wb.sheet_by_index(0)、wb.sheet_by_name(name) wb.add_sheet(‘sheetName’) wb.worksheets()[0]或wb[name]
工作簿行数,列数 sheet.nrows、sheet.ncols sheet.max_row或sheet .max_column
按行获取单元格 sheet.row_values(‘rowNum’,‘startRow’,‘endRow’) sheet.iter_rows(‘min_row’,‘max_row’,‘min_col’,‘max_col’)
按列获取单元格 sheet.col_values(‘colNum’,‘startCol’,‘endCol’) sheet.iter_columns(‘min_row’,‘max_row’,‘min_col’,‘max_col’)
操作单元格 sheet.cell(row,col).value sheet.write(‘rowNum’,‘colNum’,‘value’) sheet.cell(row=2,column=5).value = 5
保存 wb.save(‘fileName.xls’) wb.save(‘balances.xlsx’)

操作word

python-docx是python提供的操作word的第三方包.

from docx import Document
from docx.shared import RGBColor
from docx.shared import Inches,Pt
from docx.enum.text import WD_PARAGRAPH_ALIGNMENT
from docx.enum.style import WD_STYLE_TYPE
from docx.oxml.ns import qn
def main():
	 document = Document()
	 #修改文档样式Normal的字体类型,大小,颜色
	 document.styles['Normal'].font.name = u'微软雅黑'
	 document.styles['Normal'].font.size = Pt(10)
	 document.styles['Normal'].font.color.rgb = RGBColor(72, 62, 65)
	 document.styles['Normal']._element.rPr.rFonts.set(qn('w:eastAsia'), u'微软雅黑')
	 
	 #添加样式CitationsBold
     styleBold = document.styles.add_style('CitationsBold', WD_STYLE_TYPE.PARAGRAPH)
     paragraph_format_bold = styleBold.paragraph_format
     #首行缩进
     paragraph_format.first_line_indent = Inches(0.25)
     #段前间距
     paragraph_format_bold.space_before = Pt(30)
     #段后间距
     paragraph_format_bold.space_after = Pt(30)
     #段内间距
     paragraph_format_bold.line_spacing = Pt(20)
     styleBold.font.color.rgb = RGBColor(72, 62, 65)
     styleBold.font.name = u'微软雅黑'
     styleBold.font.size = Pt(17)
     styleBold.font.bold = True
     styleBold._element.rPr.rFonts.set(qn('w:eastAsia'), u'微软雅黑')
     #添加一级标题
 	 runTitle0 = document.add_heading(level=1).add_run("研究报告" )
  	 runTitle0.font.name = u'微软雅黑'
     runTitle0._element.rPr.rFonts.set(qn('w:eastAsia'), u'微软雅黑')
     #添加段落,赋予样式
     document.add_paragraph( '研究动态', style='CitationsBold')
     #添加图片
     document.add_picture(stackplot, width=Inches(5.9))
     #保存
     document.save("filename.docx")
     
     

pdf转纯文本

import os
import re,codecs
from pdfminer.converter import PDFPageAggregator
from pdfminer.pdfparser import PDFParser
from pdfminer.pdfdocument import PDFDocument
from pdfminer.pdfpage import PDFPage
from pdfminer.pdfpage import PDFTextExtractionNotAllowed
from pdfminer.pdfinterp import PDFResourceManager
from pdfminer.pdfinterp import PDFPageInterpreter
from pdfminer.layout import *

def pdfTotxt(filepath):
	try:

		fp = file(filepath, 'rb')
		# 创建一个PDF文档解析器对象
		parser = PDFParser(fp)
		document = PDFDocument(parser)
		# 创建一个PDF资源管理器对象来存储共享资源
		# caching = False不缓存
		rsrcmgr = PDFResourceManager(caching=False)
		# 创建一个PDF设备对象
		laparams = LAParams()
		# 创建一个PDF页面聚合对象
		device = PDFPageAggregator(rsrcmgr, laparams=laparams)
		# 创建一个PDF解析器对象
		interpreter = PDFPageInterpreter(rsrcmgr, device)
		replace = re.compile(r'\s+');
		content = ''
		# 循环遍历列表,每次处理一个page的内容
		for page in PDFPage.create_pages(document):
			interpreter.process_page(page)
			# 接受该页面的LTPage对象
			layout = device.get_result()
			# 这里layout是一个LTPage对象 里面存放着 这个page解析出的各种对象
			# 一般包括LTTextBox, LTFigure, LTImage, LTTextBoxHorizontal 等等
			for x in layout:
				# 如果x是水平文本对象的话
				if (isinstance(x, LTTextBoxHorizontal)):
					text = re.sub(replace, '', x.get_text())
					text = text.replace(u'.', '')
					if len(text) != 0:
						content += text

		# 关闭输入流
		fp.close()
		device.close()
		return content

	except Exception, e:
		print "Exception:", e

生成pdf文件

from reportlab.pdfgen.canvas import Canvas
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.cidfonts import UnicodeCIDFont
# pdfmetrics.registerFont(UnicodeCIDFont('STSong-Light'))
from reportlab.pdfbase.ttfonts import TTFont
pdfmetrics.registerFont(TTFont('simhei', 'simhei.ttf'))
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.enums import TA_LEFT, TA_CENTER
from reportlab.lib import colors
from reportlab.platypus import SimpleDocTemplate, Paragraph, Image,Frame, PageTemplate
def footer(canvas):
    """
    设置页脚或页眉
    :param canvas:Canvas类型  pdf画布
    """
    canvas.saveState()  # 先保存当前的画布状态
    # pageNumber = ("--%s--" % canvas.getPageNumber())  # 获取当前的页码 
    pageNumber = ("选题指南")
    stylesheet = getSampleStyleSheet()
    stylesheet.add(ParagraphStyle(fontName='simhei', name='simhei', leading=12, fontSize=8))
    p = Paragraph(pageNumber,stylesheet['simhei'])
    w, h = p.wrap(200 , 100 )  # 申请一块1cm大小的空间,返回值是实际使用的空间
    p.drawOn(canvas, 235,  810)  # 将页码放在指示坐标处
    canvas.restoreState()
    
def main():
	#设置样式	
	stylesheet = getSampleStyleSheet()
	stylesheet.add(ParagraphStyle(fontName='simhei', name='simhei', leading=15, fontSize=10,spaceAfter=6,spaceBefore=6))
	stylesheet.add(ParagraphStyle(name='titledef',parent=stylesheet['Normal'],fontName = 'simhei',fontSize=18,leading=22,alignment=TA_CENTER,spaceAfter=6))
	stylesheet.add(ParagraphStyle(name='head1def',parent=stylesheet['Normal'],fontName = 'simhei',fontSize=14,leading=18,spaceBefore=12,spaceAfter=6))
	stylesheet.add(ParagraphStyle(name='head2def',parent=stylesheet['Normal'],fontName = 'simhei',fontSize=12,leading=14,spaceBefore=12,spaceAfter=6))
	#定义容器
	story = []
	#添加内容,样式是标题
	story.append(Paragraph("分析报告", stylesheet['titledef']))
	#添加内容,样式是段落标题
	story.append(Paragraph(u"一、主题概览", stylesheet['head1def']))
	#添加图片
	story.append('图片地址')
	#添加普通内容
	story.append(Paragraph('content', stylesheet['simhei']))
	#保存
	doc = SimpleDocTemplate('pdf/filename.pdf')
	doc.build(story,onFirstPage=footer,onLaterPages=footer)
2019-01-07 12:42:53 qq_42505705 阅读数 614

在数字图像处理领域,《数字图像处理(第三版)》作为主要教材已有30多年。这是目前笔者个人所记录的笔记,后续会不断更新。若要获取本书pdf版本以及更多python,深度学习,机器学习,计算机视觉等高清PDF以及 个人笔记的 word版本,可在微信公共号“分享猿”获取资源。
在这里插入图片描述
13.阵列相乘&矩阵相乘
阵列相乘
在这里插入图片描述
矩阵相乘
在这里插入图片描述
备注:之后所用基本上都是阵列(array)相乘

14.算子
算子 H 对给定的输入图像 f(x,y) ,产生一幅输入图像 g(x,y):
在这里插入图片描述
如果
在这里插入图片描述
则称 H 是一个线性算子

15.算术操作
图像间数算操作是阵列操作,在相应像素之间执行。
在这里插入图片描述
下面是几个算术操作在图像处理中的例子
① 针对降噪的带噪声图像相加(平均)
令 g(x,y) 是无噪图像 f(x,y) 被加性噪声 η(x,y) 污染后的图像,即
在这里插入图片描述
这里假设在每对坐标(x,y)处,噪声是不相关的,并且其均值为零。以下步骤的目的是通过组带噪图像{ g_i (x,y) }的相加减少噪声。
在这里插入图片描述
然后,遵循
在这里插入图片描述

在这里插入图片描述
随着K的增大,在每个位置 (x,y) 处的像素值的变化(就像方差或标准差度量的那样)将减小。因为E{g ̅(x,y)}= f(x,y),这意味着在求平均过程中所使用的带噪图像的数量K增加时,g ̅(x,y) 将通近 f(x,y)。
在这里插入图片描述

② 增强差别的图像相减
图像相减经常作用于增强图像之间的差
g(x,y)= f(x,y)-h(x,y)
在这里插入图片描述

③ 使用图像相乘和相除来校正阴影
图像相乘(或相除)的一种重要应用是阴影校正

g(x,y)= f(x,y) ·h(x,y)
f(x,y) 表示完美图像,h(x,y) 表示阴影函数
加粗样式
图像相乘的另一种普通应用时模板操作,也称感兴趣区域(ROI)操作
模板图像的ROI区域为1,其他区域为0
在这里插入图片描述

16.灰度范围改变
大多数图像用8比特(RGB也是3个8比特通道)显示,灰度值范围为0~255
下面的操作将其他范围的转为特定 √K 比特数(范围是[0,K])
f_m=f-min⁡(f)f_s=K[f_m/max⁡(f_m ) ]
在处理8比特图像时,置K = 255,得到一灰度范围为[0,255]的全部8比特的满标度图像。
另外在执行除法操作时,需要将较小的数加到图像像素上,以免用0去除。

17.集合操作
交∩、并∪、补 A^C={├ ω┤|w∉A} = U -A 差
图像灰度的集合操作 – 有些区别
令灰度级图像的元素用集合A来表示,这些元素是(x,y,z),x,y是坐标,z为灰度值,
A的补集定义为 A^C={(x,y,K-z) | x,y,z∈A}
两个灰度集合A和B的并集可定义为集合
在这里插入图片描述
下面的三幅图展示了灰度级图像的集合操作
在这里插入图片描述在这里插入图片描述在这里插入图片描述
原图像、使用补集获得的负像、前两副图像的并集

获取此三张高清图片以及这部分 代码实现 可在文章开头的公众号内 回复“骨骼“获取

18.逻辑操作
在这里插入图片描述
或OR且AND非NOT分别对应集合操作中的交并补
AND-NOT 对应集合操作的减
XOR 异或

逻辑操作广泛用于图像的形态学处理

19.模糊集合
前述的集合和逻辑结果是“干脆”的概念,在这种意义下,元素要么是要么不是集合中的成员。这在某些应用中受到严重限制。
假如我们希望把世界上的所有人分为年轻人和非年轻人。使用“干脆”的集合,令U代表所有的人,令A是U的子集,表示年轻人集合。为了形成集合A。我们需要个隶属度函数,该函数可以对U中的每个元素(人)赋1值或0值。隶属度函数简单地定义为个阅值,低于该阔值的人考虑为年轻人。高于该阔值的人考虑为非年轻人。
模糊集合理论使用隶属度函数来实现这种概念,该函数在数值1(定义为年轻)和0(定义为非年轻)之间逐步过渡。使用模糊集合,我们可以声明个人的年轻度为50% (年轻和非年轻过渡的中间)。换句话说,年龄是个不精确的概念,而模糊逻辑提供处理这种概念的工具。

20.空间操作
空间操作之间在给定图像的像素上执行,我们把空间操作分为三大类
(1)单像素操作
(2)邻域操作
(3)几何空间变换

单像素操作
s=T(z) - T为变换函数

邻域操作
令 s_xy 表示输入图像 f 中任一点(x,y)为中心的一个邻域的坐标集。
输出图像 g 在经过特定操作后形成。
假如该操作是 计算大小为m*n、中心在(x,y)的矩形邻域中的像素平均值。可由下式表达:
在这里插入图片描述
在这里插入图片描述

几何空间变换
包括以下两个步骤:
(1)坐标的空间变换
在这里插入图片描述
(2)灰度内插
最近邻、双线性、双三次

最常用的空间坐标变换之一是仿射变换,其一般形式如下:
在这里插入图片描述
在这里插入图片描述
两种方法使用上式:
前向映射
反向映射(更有效)

21.图像配准
在图像配准中,根据输入图像和输出图像(参考图像)找到特定变换T
约束点(控制点):在输入图像和参考图像中其位置恰好已知的相应点。
在这里插入图片描述

22.向量和矩阵操作
整个图像可当作矩阵(或向量)来处理,这是很重要的。
如,将一MN图像描述为MN1维向量,之后可用下列表示图像的线性处理:
g = Hf + n
f 表示输入图像的MN1向量,n 表示MN噪声模式的MN1向量,g 表示处理后图像的MN1向量,H 是用于对输入图像进行线性操作的MN*MN矩阵。
上式对图像复原有帮助。

23.图像变换
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
傅里叶变换之外,还有沃尔什变换哈达玛变换离散余弦变换哈尔变换斜变换等。

24.概论方法
均值和方差对于图像的视觉特效有明显的直接关系,高阶矩更敏感。
在这里插入图片描述

没有更多推荐了,返回首页