《基于Python语言的网络数据挖掘》实验指导书2014

更新时间:2024-04-11 04:34:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

Python语言的网络数据挖掘》实验

指导书

电子科技大学信息与软件工程学院

二○一四年6月

《基于

一、 实验教学目的和要求:

实验目的:

本课程实验旨在加深学生对于网络大数据挖掘的理解,培养学生分析、设计、实现基于Python语言的网络数据挖掘算法,掌握科学的实验方法,为以后其他专业课的学习打下坚实的基础。该实验内容采用循序渐进的方式,从Python语言的基本语法入手,在加深学生对于Python语言熟悉的基础上突出数据挖掘应用。实验提供功能要求,学生自己确定设计方案和需要思考如何设计最优化的算法,并完成结果记录和分析,充分发挥学生的创造性和主动性。 实验要求:

了解并掌握Python语言的基本语法、能够使用Python读取或写入数据表、获取并分析网络文本数据、获取并处理图像数据等。

二、 Python开发环境简介:

本课程实验使用的Python开发环境为Python IDLE,其用户界面图见图1所示。IDLE是开发python程序的基本集成开发环境,具备基本的IDE的功能,是Python教学的不错的选择。当安装好python以后,IDLE就自动安装好了,不需要另外去找。同时,使用Eclipse这个强大的框架时IDLE也可以非常方便的调试Python程序。其基本功能包括语法加亮、段落缩进、基本文本编辑、TABLE键控制、调试程序。

打开 Idle 后出现一个增强的交互命令行解释器窗口(具有比基本的交互命令提示符更好的剪切、粘贴、回行等功能)。除此之外,还有一个针对 Python 的编辑器(无代码合并,但有语法标签高亮和代码自动完成功能)、类浏览器和调试器。菜单为 TK “剥离”式,也就是点击顶部任意下拉菜单的虚线将会将该菜单提升到它自己的永久窗口中去。特别是 \菜单,将其“靠”在桌面一角非常实用。Idle 的调试器提供断点、步进和变量监视功能。

图1 Python IDLE界面图

三、 实验项目名称及目的要求:

实验项目1 Python语言的基本语法及简单应用 1、实验目的

1)掌握Python语言的基本语法 2)掌握Python语言中创建模块的方法 3)了解Python语言中定义类及其使用方法 4)学习使用Python语言输出斐波那契数列的方法

5)学习使用Python语言实现删除一个list里面的重复元素的方法 2、实验内容

1)根据Python基本语法功能设计出实现输出斐波那契数列的方法,并比较不同实现方法的性能。

2)根据Python语言中的排序和循环功能,实现删除一个list里面的重复元素 3、实验原理

1)设计输出斐波那契数列的Python程序:首先调用raw_input输入要打印的斐

波那契数列的长度,然后把斐波那契数列存储于一个序列当中,并逐个打印序列的元素。

此实验部分实现代码如下

#通过输入斐波那契数列的长度打印斐波那契数列

FibonacciUptoNumer = int(raw_input('Please input a Fibonacci Series up to Number : '))

n = FibonacciUptoNumer fibs = [0, 1]

for number in range(n):

fibs.append(fibs[-2] + fibs[-1])

2)设计删除一个list里面的重复元素程序:首先调用List.sort()对序列进行排序, 然后调用last = List[-1]语句从后向前找出重复的元素,并逐个打印非重复的元素。

此实验部分实现代码如下 if List: List.sort() last = List[-1]

for i in range(len(List)-2, -1, -1): if last==List[i]: del List[i] else: last=List[i] print List 4、实验步骤

1)设计输出斐波那契数列的Python程序 ? 分析实验要求

? 逐个打印输出斐波那契数列的元素 ? 记录程序代码 ? 记录并分析实验结果

2)设计程序删除一个list里面的重复元素 ? 分析实验要求 ? 对list进行排序

? 从后向前查找并删除list中的重复元素 ? 记录程序代码 ? 记录并分析实验结果

实验项目2 使用Python读写Excel数据 1、实验目的

1)强化Python程序的设计和编程能力 2)学习两种读取的Excel数据的方法 3)学习写入Excel数据的方法 4)掌握如何读写其他格式数据的方法 5)掌握如何比较不同读写方法的运算性能 2、实验内容

1)用xlrd模块中的open_workbook实现打开Excel数据表,并设计使用索引和名称两种方法读取Excel数据,最终写入csv文件中。

2)用datetime模块中的datetime.now来计算两种不同的读取方法所用CPU时间,从而比较并分析不同算法的性能。 3、实验原理

1)Python语句读取Excel表数据时,首先要调用xlrd模块,然后使用语句data = xlrd.open_workbook('excelFile.xls')打开Excel表格。

当一个Excel表格中包含多个Sheet时,可以通过索引或者名称顺序获取某一个Sheet中的数据。使用的语句分别为table = data.sheet_by_index(0)和table = data.sheet_by_name(u'Sheet1')。

当获取某个Sheet的数据并存储在工作表table后,获取获取整行和整列的值(数组)的语句为table.row_values(i)和table.col_values(i),获取行数和列数的语句为nrows = table.nrows和ncols = table.ncols,循环获取行数据的语句为for i in range(nrows): print table.row_values(i)。

此实验部分实现代码如下

#根据索引获取Excel表格中的数据

def excel_table_byindex(file= 'abc.xls',colnameindex=0,by_index=0): data = open_excel(file) table = data.sheets()[by_index] nrows = table.nrows #行数

colnames = table.row_values(colnameindex) #某一行数据 list =[]

for rownum in range(1,nrows): row = table.row_values(rownum)

if row: app = {}

for i in range(len(colnames)): app[colnames[i]] = row[i] list.append(app) return list

def excel_table_byname(file= 'abc.xls',colnameindex=0,by_name='abc'): data = open_excel(file)

table = data.sheet_by_name(by_name) nrows = table.nrows #行数

colnames = table.row_values(colnameindex) #某一行数据 list =[]

for rownum in range(1,nrows): row = table.row_values(rownum) if row: app = {}

for i in range(len(colnames)): app[colnames[i]] = row[i] list.append(app) return list

在该实验中,学生需用前述的Excel数据操作语句实现读取某一个Sheet数据的功能,并在此基础上,思考如何读取其他格式的数据,记录Python代码,并分析实验结果。

2)Python语句写入Excel表数据时,首先要调用pyExcelerator模块,然后使用语句w = Workbook()和ws = w.add_sheet('excelFile.xls')创建一个空白的工作表。在某一个cell写入数据的语句为ws.write (i, j, 'string'),而w.save('mini.xls')实现了存储写入后的Excel文件。

此实验部分实现代码如下 from pyExcelerator import *

w = Workbook() #创建一个工作簿 ws = w.add_sheet('test') #创建一个工作表 ws.write(0,0,'uestc') #在1行1列写入uestc ws.write(0,1,'Sofrware') #在1行2列写入Software ws.write(1,0,'cs') #在2行1列写入cs

w.save('mini.xls') #保存至mini.xls文件中

在该实验中,学生需用前述的Excel数据操作语句实现写入某一个Sheet数据的功能,并在此基础上,思考如何写入其他格式的数据(如csv格式),记录Python代码,并分析实验结果。

3)比较两种不同的读取Excel数据的方法时,需要计算每种方法的运行时间。首先导入datetime模块,并调用datetime.now()函数,记录某一段代码运行前后的时间点,通过开始和结束的时间点的差值计算出程序运行的时间。

此实验部分实现代码如下 starttime = datetime.datetime.now() tables = excel_table_byindex() for row in tables: print row

endtime = datetime.datetime.now() print endtime - starttime

starttime = datetime.datetime.now() tables = excel_table_byname() for row in tables: print row

endtime = datetime.datetime.now() print endtime - starttime

在该实验中,学生需用前述的CPU时间控制语句实现计算某一段代码的运算时间,并在此基础上,比较并分析两种Excel数据读取方法的性能。记录Python代码,并分析实验结果。 4、实验步骤

1)设计按名称和按索引读取Excel数据的程序 ? 分析实验要求

? 按行打印Excel表中的数据 ? 记录程序代码 ? 记录并分析实验结果 2)设计写入Excel数据的程序 ? 分析实验要求

? 按行将数据写入Excel表中 ? 记录程序代码

? 记录并分析实验结果 3)设计计算程序运行时间的程序 ? 分析实验要求 ? 记录程序代码 ? 比较并分析实验结果 ? 总结,撰写实验报告

实验项目3 使用Python实现网络爬虫算法 1、实验目的

1)强化Python程序的设计和编程能力 2)学习网络爬虫算法的原理

3)学习使用Python语言实现网络爬虫算法 2、实验内容

1)理解网络爬虫算法的原理,并设计使用Python语言获取网页数据的程序。 2)用Python语言中的threading和GetUrl模块对网站中URL进行搜集。 3、实验原理 1)爬虫算法原理:

网络爬虫(又被称为网页蜘蛛,网络机器人,网页追逐者),是一种按照一定的规则,自动的抓取万维网信息的程序或者脚本。很多搜索引擎都使用爬虫提供最新的数据,搜索引擎利用用户访问过页面的一个副本进行索引,以提供快速的访问。网络爬虫也可以在web上用来自动执行一些任务,例如检查链接,确认html代码;也可以用来抓取网页上某种特定类型信息,例如抓取电子邮件地址。

本实验中使用的网络爬虫算法是广度优先搜索(BFS)。广度优先搜索策略是指在抓取过程中,在完成当前层次的搜索后,才进行下一层次的搜索。有很多研究将广度优先搜索策略应用于聚焦爬虫中。其基本思想是认为与初始URL在一定链接距离内的网页具有主题相关性的概率很大。另外一种应用是将广度优先搜索与网页过滤技术结合使用,先用广度优先策略抓取网页,再将其中无关的网页过滤掉。这些方法的缺点在于,随着抓取网页的增多,大量的无关网页将被下载并过滤,算法的效率将变低。

2)Python语句在某一个网页上获取数据时,首先要分析网页的HTML源代码,我们以淘宝网页中的商品分类(http://list.taobao.com/browse/cat-0.htm)为例,获取所有一级类别和二级类别的标题。

本实验中要调用urllib2和sgmllib.SGMLParser模块,并使用语句content = urllib2.urlopen('网页URL').read()来获取网页的内容。并使用list.feed(content)语句将网页内容存入列表,进行处理。

此实验部分实现代码如下 class ListName1(SGMLParser):

def __init__(self):

SGMLParser.__init__(self) self.is_h4 = \self.name = [] self.is_h4 = 1 self.is_h4 = \if self.is_h4 == 1:

self.name.append(text)

def start_h4(self, attrs): def end_h4(self): def handle_data(self, text):

class ListName2(SGMLParser):

def __init__(self):

SGMLParser.__init__(self) self.is_h5 = \self.name = [] self.is_h5 = 1 self.is_h5 = \if self.is_h5 == 1:

self.name.append(text)

def start_h5(self, attrs): def end_h5(self): def handle_data(self, text):

content = urllib2.urlopen('http://list.taobao.com/browse/cat-0.htm').read() listname1 = ListName1() listname2 = ListName2() listname1.feed(content) listname2.feed(content)

在该实验中,学生需用前述的爬虫算法实现语句实现写入读取淘宝网页商品分类标题的功能,并在此基础上,思考如何实现读取其他网页数据的方法,记录Python代码,并分析实验结果。

3)在获取网站上的URL时,需要调用GetUrl模块。本实验中通过调用threading 模块采用多线程算法实现网站URL的获取。

此实验部分实现代码如下

def Craw(self,entryUrl): #这是一个深度搜索,到g_toDlUrl为空时结束 g_toDlUrl.append(entryUrl)

self.logfile.write('>>>Entry:\\n') self.logfile.write(entryUrl) depth = 0

while len(g_toDlUrl) != 0 and depth <= self.Maxdepth: depth += 1

print 'Searching depth ',depth,'...\\n\\n' self.downloadAll() self.updateToDl()

content = '\\n>>>Depth ' + str(depth)+':\\n' self.logfile.write(content) i = 0 while i < len(g_toDlUrl): content = str(g_totalcount + i + 1) + '->' + g_toDlUrl[i] + '\\n' self.logfile.write(content) i += 1

class CrawlerThread(threading.Thread): def __init__(self, url, fileName): threading.Thread.__init__(self) self.url = url #本线程下载的url self.fileName = fileName

def run(self): #线程工作-->下载html页面 global g_mutex global g_failedUrl global g_dledUrl try:

f = urllib.urlopen(self.url)

s = f.read()

fout = file(self.fileName, 'w') fout.write(s) fout.close() except:

g_mutex.acquire() #线程锁-->锁上 g_dledUrl.append(self.url) g_failedUrl.append(self.url)

g_mutex.release() #线程锁-->释放 print 'Failed downloading and saving',self.url return None #记着返回!

g_mutex.acquire() #线程锁-->锁上 g_pages.append(s) g_dledUrl.append(self.url)

g_mutex.release() #线程锁-->释放

在该实验中,学生需用上述网络爬虫算法和多线程控制语句实现获取某一网站所有URL的程序,并在此基础上,比较并分析采用不同线程数时算法的性能。记录Python代码,并分析实验结果。 4、实验步骤

1)设计某一个网页上获取数据的程序 ? 分析实验要求 ? 打印网页上获取的数据 ? 记录程序代码 ? 记录并分析实验结果

2)设计多线程的获取网站URL的程序 ? 分析实验要求

? 打印网站上相关的URL ? 比较不同线程数的算法性能 ? 记录程序代码 ? 记录并分析实验结果

实验项目4 使用Python获取社交网络数据 1、实验目的

1)强化Python程序的设计和编程能力 2)学习社交网络OAUTH协议的原理 3)学习使用Python语言获取社交网络数据 2、实验内容

1)理解社交网络OAUTH协议的原理,并学习获取CONSUMER_KEY、CONSUMER_SECRET、USER_TOKEN、USER_SECRET的方法。

2)用Python语言中的Json、OS、Linkedin模块对LinkedIn网站中联系人名单进行搜集。 3、实验原理

1)社交网络OAUTH协议原理:

OAUTH协议为用户资源的授权提供了一个安全的、开放而又简易的标准。与以往的授权方式不同之处是OAUTH的授权不会使第三方触及到用户的帐号信息(如用户名与密码),即第三方无需使用用户的用户名与密码就可以申请获得该用户资源的授权,因此OAUTH是安全的。

本实验中Linkedin网站的OAUTH协议是采用HMAC-SHA1加密的。开发者需要注册LinkedIn账户,获得CONSUMER_KEY(即API Key) 和CONSUMER_SECRET。KEY跟SECRET的使用方式跟其他一些协议中的公钥私钥的方案相类似,你可以使用你所熟悉的编程语言将KEY和SECRET结合,为你发出的每个请求添加签名,以此来向Linkedin开放平台表明自己身份的合法性。然后根据CONSUMER_KEY和CONSUMER_SECRET获取USER_TOKEN和USER_SECRET。这个步骤主要有两个目的:第一,告诉Linkedin将要做什么;第二,告诉Linkedin在callback里要做什么。此外,USER_TOKEN和USER_SECRET可以帮助提供ACCESS TOKEN。

实现代码如下:

access_token_url = 'https://api.linkedin.com/uas/oauth/accessToken' token=oauth.Token(request_token['oauth_token'], request_token['oauth_token_secret']) token.set_verifier(oauth_verifier) client = oauth.Client(consumer, token)

resp, content = client.request(access_token_url, \access_token = dict(urlparse.parse_qsl(content)) print \

print \

print \print

print \Print

在该实验中,学生需用前述的OAUTH协议原理实现获取Linkedin社交网络的ACCESS TOKEN,并在此基础上,思考如何实现读取其他社交网络(如新浪微博)ACCESS TOKEN的方法,记录Python代码,并分析实验结果。

2)Python语句获取社交网站用户信息时,首先要获得ACCESS TOKEN,然后调用os.path.join语句将用户相关信息存储到CSV或者XLS文件中,最后调用PrettyTable模块打印用户信息表。

此实验部分实现代码如下

# Instantiate the developer authentication class

auth=linkedin.LinkedInDeveloperAuthentication(CONSUMER_KEY, CONSUMER_SECRET,

USER_TOKEN,

USER_SECRET,

RETURN_URL,

permissions=linkedin.PERMISSIONS.enums.values())

# Pass it in to the app...

app = linkedin.LinkedInApplication(auth) # Use the app... app.get_profile() import json import os

connections = app.get_connections()

connections_data = os.path.join(\\\用户名\\\

f = open(connections_data, 'w')

f.write(json.dumps(connections, indent=1)) f.close()

from prettytable import PrettyTable # pip install prettytable pt = PrettyTable(field_names=['Name', 'Location']) pt.align = 'l'

[ pt.add_row((c['firstName'] + ' ' + c['lastName'], c['location']['name'])) for c in connections['values'] if c.has_key('location')]

在该实验中,学生需用前述的社交网络信息获取语句实现授权用户的

LinkedIn联系人信息,并在此基础上,思考如何实现获取其他社交网络(微博)用户信息的方法,记录Python代码,并分析实验结果。 4、实验步骤

1)设计社交网络授权用户ACCESS TOKEN的程序 ? 分析实验要求 ? 记录程序代码

2)设计社交网络授权用户联系人信息的程序 ? 分析实验要求

? 打印授权用户联系人信息 ? 导入授权用户联系人的信息 ? 记录程序代码 ? 记录并分析实验结果

实验项目5 使用Python统计分析社交网络数据 1、实验目的

1)强化Python程序的设计和编程能力

2)学习社交网络数据清洗和数据统计分析的方法 3)学习使用Python语言统计分析社交网络数据 2、实验内容

1)学习社交网络中联系人职位、公司、年龄等信息的数据清洗和统计分析方法。 2)用Python语言中的Counter、itemgetter等模块对LinkedIn网站中联系人名单信息进行初步的统计分析。 3、实验原理 1)数据清洗:

数据清洗是指发现并纠正数据文件中可识别的错误,包括检查数据一致性,处理无效值和缺失值等。由于数据仓库中的数据是面向某一主题的数据的集合,这些数据从多个业务系统中抽取而来而且包含历史数据,这样就避免不了有的数据是错误数据、有的数据相互之间有冲突,这些错误的或有冲突的数据显然是我们不想要的,称为“脏数据”。我们要按照一定的规则把脏数据清除,这就是数据清洗。而数据清洗的任务是过滤那些不符合要求的数据,将过滤的结果交给业务主管部门,确认是否过滤掉还是由业务单位修正之后再进行抽取。不符合要求的数据主要是有不完整的数据、错误的数据、重复的数据三大类。

本实验中使用的数据来源是Linkedin网站中联系人信息,需要清洗的数据

主要是由于数据名称不统一造成的。例如,联系人公司中很多都带有后缀Inc.,Co.等,联系人职位中很多带有Prof., Dr.等,这些信息在统计时会有干扰作用。例如IBM Inc.和IBM代表的都是IBM公司,但程序在进行统计分析时会误认为是两个不同的公司。

实现代码如下:

transforms = [(', Inc.', ''), (', Inc', ''), (', LLC', ''), (', LLP', ''), (' LLC', ''), (' Inc.', ''), (' Inc', '')]

csvReader = csv.DictReader(open(CSV_FILE), delimiter=',', quotechar='\contacts = [row for row in csvReader]

companies = [c['Company'].strip() for c in contacts if c['Company'].strip() != ' '] for i, _ in enumerate(companies): for transform in transforms:

companies[i] = companies[i].replace(*transform)

在该实验中,学生需用前述的数据清洗方法实现对Linkedin社交网络联系人信息进行数据清洗,并在此基础上,思考如何实现清洗其他社交网络(如新浪微博)联系人信息的方法,记录Python代码,并分析实验结果。

2)Python语句分析清洗后的社交网站联系人信息时,首先要调用Counter模块语句将联系人相关信息进行统计,并调用PrettyTable模块将联系人信息存储在表中,最后调用print语句按照降序打印用户信息表。

此实验部分实现代码如下

pt = PrettyTable(field_names=['Company', 'Freq']) pt.align = 'c'

c = Counter(companies) [pt.add_row([company, freq])

for (company, freq) in sorted(c.items(), key=itemgetter(1), reverse=True) if freq > 0] print pt

titles = [c['Job Title'].strip() for c in contacts if c['Job Title'].strip() != ' ']

for i, _ in enumerate(titles): for transform in transforms:

titles[i] = titles[i].replace(*transform) pt2 = PrettyTable(field_names=['Job Title', 'Freq']) pt2.align = 'c'

c = Counter(titles) [pt2.add_row([title, freq])

for (title, freq) in sorted(c.items(), key=itemgetter(1), reverse=True) if freq > 0]

在该实验中,学生需用前述的统计分析方法分析LinkedIn联系人信息,并在此基础上,思考如何实现分析其他社交网络(微博)联系人信息的方法,记录Python代码,并分析实验结果。 4、实验步骤

1)设计社交网络数据清晰的程序 ? 分析实验要求 ? 清洗网络中的脏数据 ? 记录程序代码

2)设计统计分析社交网络联系人信息的程序 ? 分析实验要求

? 统计并打印联系人列表中的信息数据 ? 记录程序代码 ? 记录并分析实验结果

实验项目6 使用Python大批量获取网络图片数据 1、实验目的

1)强化Python程序的设计和编程能力 2)了解大批量获取网络图片的原理 3)学习使用Python语言批量获取网络图片 2、实验内容

1)了解大批量获取网络图片的原理,并掌握批量获取网络图片的方法。 2)用Python语言中的urllib、urllib2等模块对图虫网站中的图片进行批量下载,并存储在指定的文件夹中。 3、实验原理

1)批量获取网络图片的方法:

批量获取网络图片的方法是通过解析网页的HTML文件,利用正则表达式把源代码中的图片地址过滤出来,从而根据过滤出来的图片地址下载网络图片。具体来说,批量获取网络图片的方法分为三种,一是用微软提供的扩展库win32com来操作IE,二是用selenium的webdriver,三是用python自带的

HTMLParser解析。win32com可以获得类似js里面的document对象,但文件是只读的。selenium则提供了对Chrome,IE,FireFox等浏览器的支持,每种浏览器都有execute_script和find_element_by_xx方法,可以方便的执行js脚本(包括修改元素)和读取html里面的元素。不足是selenium只提供对python2.6和2.7的支持。HTMLParser则是需要自己写个类继承基类,重写解析元素的方法。 2)本实验中使用的批量获取网络图片的方法,属于第三种方法。首先通过urllib2.urlopen(url).read().decode('utf-8')语句解析HTML文件,再使用re.findall将把源代码中的图片地址过滤出来,最后使用urllib.urlretrieve(imgurl, target)语句将图片下载到指定路径的文件夹中。

实现代码如下: #获取二级页面url def findUrl2(html):

re1 = r'http://tuchong.com/\\d+/\\d+/|http://\\w+(?

#获取html文本 def getHtml(url):

html = urllib2.urlopen(url).read().decode('utf-8')#解码为utf-8 return html

#下载图片到本地

def download(html_page , pageNo): #定义文件夹的名字 x = time.localtime(time.time())

foldername=str(x.__getattribute__(\

tm_mon\

re2=r'http://photos.tuchong.com/.+/f/.+\\.jpg' imglist=re.findall(re2,html_page) print imglist download_img=None

for imgurl in imglist:

picpath='C:\\\\Users\\\\peterlindi\\\\Desktop\\\\lindi\\\\%s\\\\%s'%(foldername,st

r(pageNo))

filename = str(uuid.uuid1()) if not os.path.exists(picpath):

os.makedirs(picpath) target = picpath+\ print \

download_img = urllib.urlretrieve(imgurl, target) time.sleep(1) print(imgurl) return download_img

在该实验中,学生需用前述的批量网络图片获取方法实现对图虫网制定页面图片进行批量下载,并在此基础上,思考如何实现批量下载其他图库的方法,记录Python代码,并分析实验结果。 4、实验步骤

设计批量获取图片的程序 ? 分析实验要求

? 批量获取并存储网络图片 ? 记录程序代码 ? 记录并分析实验结果

实验项目7 使用Python处理图片尺寸和角度 1、实验目的

1)强化Python程序的设计和编程能力 2)学习图片的像素矩阵表示方法

3)学习使用Python语言调整图像尺寸和角度 2、实验内容

1)学习使用像素矩阵表示图片的方法。

2)用Python语言中的Image等模块对图片尺寸、角度等进行处理的方法。 3、实验原理

1)图片的像素矩阵表示:

数字图像数据可以用矩阵来表示,因此可以采用矩阵理论和矩阵算法对数字

图像进行分析和处理。最典型的例子是灰度图像。灰度图像的像素数据就是一个矩阵,矩阵的行对应图像的高(单位为像素),矩阵的列对应图像的宽(单位为像素),矩阵的元素对应图像的像素,矩阵元素的值就是像素的灰度值。

在计算机数字图像处理程序中,通常用二维数组来存放图像数据。二维数组的行对应图像的高,二维数组的列对应图像的宽,二维数组的元素对应图像的像素,二维数组元素的值就是像素的灰度值。采用二维数组来存储数字图像,符合二维图像的行列特性,同时也便于程序的寻址操作,使得计算机图像编程十分方便。

图像的位图数据是一个二维数组(矩阵),矩阵的每一个元素对应了图像的一个像素,当保存一幅图像时,不但要保存图像的位图数据矩阵,还要将每个像素的颜色保存下来,颜色的记录是利用颜色表来完成的。颜色表,也叫颜色查找表,是图像像素数据的颜色索引表。以一个4色位图为例,则其颜色表有4个表项,表中每一行记录一种颜色的R、G、B值,这样,当表示一个像素的颜色时,只需要指出该颜色在第几行,即该颜色在表中的索引值即可。

2)Python语句调整图片的尺寸和角度时,首先要调用Image模块中的im=Image.open( \)语句打开指定的预处理图片,并调用im.size和im.resize记录并调整图片的尺寸,调用im.rotate语句调整图片的角度,最后调用im.convert实现图片格式的转换。

此实验部分实现代码如下 import Image

im = Image.open( \print im.size width = 200

ratio = float(width)/im.size[0] height = int(im.size[1]*ratio)

nim1 = im.resize( (width, height), Image.BILINEAR ) print nim1.size nim1.save( \

nim2 = im.rotate( 45, Image.BILINEAR ) nim2.save( \

nim3 = im.rotate( 90, Image.BILINEAR ) nim3.save( \

gray_img = im.convert(\

gray_img2= gray_img.resize((128,128),Image.BILINEAR) print gray_img2.histogram()

在该实验中,学生需用前述的图片处理方法对指定图片的尺寸和角度进行调整,并在此基础上,思考如何实现调整其他图片参数的方法,记录Python代码,并分析实验结果。 4、实验步骤

设计图片处理方法的程序 ? 分析实验要求

? 实现指定图片的尺寸和角度进行调整 ? 记录程序代码 ? 记录并分析实验结果

实验项目8 使用Python处理图片亮度、对比度和饱和度 1、实验目的

1)强化Python程序的设计和编程能力

2)学习图像的亮度、对比度和饱和度等参数的表示方法 3)学习使用Python语言调整图像亮度、对比度和饱和度 2、实验内容

1)学习图像的亮度、对比度和饱和度等参数的表示方法。

2)用Python语言中的Image、ImageDraw、ImageEnhance等模块对图片亮度、对比度和饱和度等进行处理的方法。 3、实验原理

1)图像的主要指标参数:

在图像处理中,图像的主要指标参数包括亮度、对比度、饱和度等。 亮度是指图片的明亮程度,计算亮度的基准是灰度测试卡。黑色为0,白色为10,在0—10之间等间隔的排列为9个阶段。色彩可以分为有彩色和无彩色,但后者仍然存在着亮度。作为有彩色,每种色各自的亮度在灰度测试卡上都具有相应的位置值。彩度高的色对亮度有很大的影响,不太容易辨别。在明亮的地方鉴别色的亮度比较容易的,在暗的地方就难以鉴别。

对比度指的是一幅图像中明暗区域最亮的白和最暗的黑之间不同亮度层级的测量,即指一幅图像灰度反差的大小。差异范围越大代表对比越大,差异范围越小代表对比越小,好的对比率120:1就可容易地显示生动、丰富的色彩,当对比率高达300:1时,便可支持各阶的颜色。但对比率遭受和亮度相同的困境,现

今尚无一套有效又公正的客观标准来衡量对比率,所以最好的辨识方式还是依靠使用者眼睛。

色彩是由于物体上的物理性的光反射到人眼视神经上所产生的感觉,颜色的不同是由光的波长的长短差别所决定的。作为色彩度,指的是这些不同波长的色的情况。波长最长的是红色,最短的是紫色。把红、黄、绿、蓝、紫和处在它们各自之间的黄红、黄绿、蓝绿、蓝紫、红紫这5种中间色——共计10种色作为色相环。在色相环上排列的色是纯度高的色,被称为纯色。这些颜色在环上的位置是根据视觉和感觉的相等间隔来进行安排的。用类似这样的方法还可以再分出差别细微的多种色来。在色相环上,与环中心对称,并在180度的位置两端的色被称为互补色。

用数值表示色的鲜艳或鲜明的程度称之为饱和度,也称为纯度、彩度。有彩色的各种色都具有彩度值,无彩色的色的彩度值为0,对于有彩色的色的彩度(纯度)的高低,区别方法是根据这种色中含灰色的程度来计算的。彩度由于色相的不同而不同,而且即使是相同的色相,因为明度的不同,彩度也会随之变化的。 2)Python语句调整图片的亮度、对比度和饱和度时,首先要调用Image模块中的im=Image.open( \语句打开指定的预处理图片,并调用ImageDraw模块记录图片的亮度、对比度和饱和度,调用ImageEnhance模块调整图片的亮度、对比度和饱和度。

此实验部分实现代码如下

import Image,ImageDraw,ImageEnhance img = Image.open('messi.jpg') draw = ImageDraw.Draw(img) width,height = img.size

draw.line(((0,0),(width-1,height-1)),fill = 254) draw.arc((0,0,width-1,height-1),0,360,fill=254) img.save('messi2.jpg')

#亮度增强(adjust image brightness)

brightness = ImageEnhance.Brightness(img) #调用Brightness类 bright_img = brightness.enhance(3.0) bright_img.save('bright_messi.jpg')

#图像尖锐化(adjust image sharpness)

sharpness = ImageEnhance.Sharpness(img) #调用Sharpness类

sharp_img = sharpness.enhance(6.0) sharp_img.save('sharp_messi.jpg')

#对比度增强(adjust image contrast) contrast = ImageEnhance.Contrast(img) contrast_img = contrast.enhance(3.0) contrast_img.save('contrast_messi.jpg')

#饱和度增强,(adjust image color) color = ImageEnhance.Color(img) color_img = color.enhance(3.0) color_img.save('color_messi.jpg')

在该实验中,学生需用前述的图片处理方法对指定图片的亮度、对比度和饱和度进行调整,并在此基础上,思考如何实现调整其他图片视觉参数的方法,记录Python代码,并分析实验结果。 5、实验步骤

设计图片处理方法的程序 ? 分析实验要求

? 实现指定图片的亮度、对比度和饱和度等的调整 ? 记录程序代码 ? 记录并分析实验结果

本文来源:https://www.bwwdw.com/article/wjyp.html

Top