张剑锋
《普通高中信息技术课程标准(版)》公布后,根据其修改的新教材也陆续出版。拿到浙江教育出版社出版的高中信息技术必修教材《数据与计算》后,笔者仔细学习了“算法的程序实现”内容,对Python内容教学有了更深刻的理解,但也产生了一些想法。
● 技术优先还是认知为要
教材在Python语言程序设计的“实践与体验”环节,介绍了“编程实现图像的简单处理”,目的是通过调整图像的颜色来初步体验Python语言在图像处理上的功能,实践步骤为:①导入Image、numpy、matplotlib三个模块;②打开图像并转换成数字矩阵;③调整每个像素的RGB值;④生成灰度新图像并显示。这段内容为后面的实践起到了铺垫作用,构思好,但在具体语句的实现上,笔者觉得还有待商榷。
在数字图像处理中,不同的图像格式有其特定的处理算法,在做图像处理之前,需要考虑清楚要基于哪种格式的图像进行算法设计及其实现。PIL(Python Image Library)是Python的第三方图像处理库,有九种不同模式,教材中用到了convert()函数的转换,使用了L模式,把原始彩色图片转换为灰色图像(模式“L”为灰色图像,它的每个像素用8个bit表示,0表示黑,255表示白,其他数字表示不同的灰度。在PIL中,从模式“RGB”转换为“L”模式是按照下面的公式转换的:L=R*299/1000+G*587/1000+B*114/1000)。
打开图像,得到各像素点颜色的RGB值后,直接对像素点颜色值进行操作,这符合高中学生初学Python的认知方式,读入图片直接操作能加深学生对数字图像处理的理解。而原例中转换为二维数组,再对二维数组的元素进行操作来改变像素颜色值,增加了学生的认知障碍。另外,程序此处引入numpy模块毫无优势可言,虽然使用numpy模块是图像后续处理的首选思路,使用数组来存储数据也能使学生养成良好的技术习惯与意识,但放在这里,思维脉络上略显突兀,故numpy不妨移后介绍。
从突出重点、降低学生认知困难上来考虑,这里转换为灰度后,可使用getpixel函数直接对像素点进行操作(getpixel函数是用来获取图像中某一像素的颜色值),把实验步骤②、③不妨改为“转换各像素的颜色为黑白二色”,直接使用代码完成黑白二值转换,新代码如图1所示。
推而广之,在Python语言的教学中,是考虑技术意识优先,还是以学生的认知习惯为要,这是要好好斟酌的。思维的培养是一个长期熏陶的过程,对numpy的介绍,可随着学生的认知特点,渐进式地介绍,从而进一步加深学生对不同技术选择的理解与感悟。
另外,在教材导入模块前,可补充介绍第三方模块的安装,因为丰富的第三方模块库的安装,是学生以后学习Python必需的基础。
● 重构示例深化计算思维
教材在“3.3简单算法及其程序实现”中,主要介绍解析算法及其程序实现、枚举算法及其程序实现和算法实现的综合运用。教材中以答题卡准考证号的识别作为示例,非常贴近学生的学习生活,是一个精心构思。一般答题卡的识别大都是光学识别,本例使用计算机图像识别技术,进行分析处理,也是计算机化的一个重要途径,但教材中示例的具体设计与实现,稍显割裂,详细研读本段内容后,略感意犹未尽。
计算思维是高中信息技术学科的四大核心素养之一,教材通过答题卡识别示例的具体实现,力图抓住计算思维本质,引导学生从Python语言的实现角度来界定问题、转化问题,对问题抽象建模,合理组织数据,形成解决方案。为加强计算思维的渗透,笔者设想以项目完整实现为抓手,对教材中的相应内容进行再设计。
1.分析
对答题卡的识别,不妨把整张卡的识别问题进行分解、细化,先缩小为一道题的识别,而一道题的识别,就变成对A、B、C、D四个选择区域的判别,如果按照答题卡的彩色进行判别,有一定难度;我们就把各像素点的颜色从彩色转换为灰度,再依据一定标准转换为黑白两色,将图像二值化后便于识别。这也是计算思维中的分解、降维思想,要在教材中加以凸显,便于引导教师在教学中进行深化。
一道题A、B、C、D四个选项的判定,取决于识别出A、B、C、D的选项区域哪个被填涂,填涂区域的像素点为黑色,像素值为0;未填涂区域,像素点为白色,像素值为1。可分别累加这四个区域像素点的值,等于0的区域,就是被填涂的,即该区域的选项被选中,一道题的判定即告完成。重复此过程,整张答题卡的答案均可判读。
2.抽象与建模
预备:通过以下两行代码,显示处理后的图片。
plt.imshow(img_I,cmap="gray")
plt.show() # 显示图片,便于放大分析
通过zoom图标放大图像,可查看各点坐标,进而分析出相关参数:题号1,A选项填涂区域左上角的顶点坐标(14,240),A选项填涂区域右下角的顶点坐标(16,245);B选项,左上角的顶点坐标(14,261),B选项右下角的顶点坐标(16,266);详细分析C、D选项的选项区域后,可以得到填涂区域长度为12,宽度为5,各选项之间的间隔为6,各题的间隔也为6。这样,可以进一步分析实际填涂区域大概是11*5=55个像素点,分别累加这四个区域各像素点的值,理论上,未填涂的三个区域的值应等于55,只有一个区域的值等于0,这就是被填涂区域,即此区域选择被选中。(考虑到实际的误差因素,一般三个区域值大于53,剩下区域的值小于3即可)
3.编写程序
题号1的判别程序代码如图2所示。
字典是Python基本的内置数据类型,针对字典数据类型的特点,我们可把四个选项的代码循环来处理,优化如图3所示。
items()方法可把字典中每对key和value组成一个元组,并把这些元组放在列表中返回。通过这个方法,可以加深学生对字典这一数据类型的理解。而对于准考证号的识别,则可以将其作为课后作业。
4.函数的使用
题号1的选项识别,是整个程序的核心算法,其他各题的识别,基本上是重复这段代码,我们可以将此部分优化成函数,来实现程序的模块化设计。函数运用及函数思想的渗透,是计算思维的重要体现,而培养学生的函数思想,是深入体现计算思维的又一重要抓手。
5.拓展思考
(1)加入容错分析。细心的学生如果仔细思考,应该能考虑到选项意外填涂时的容错。首先,没有填涂时,4个区域像素值的和均为60,可以据此判断,未填涂;若误涂了多个区域,那么,应该是有少于3个区域的像素值接近60,也可以据此识别结果无效。部分代码如图4所示。
(2)对全班学生答题卡的打开。全班学生的答题卡文件,保存在同一个文件夹下,可遍历当前文件夹下的所有图片文件,使用的是os.walk方法,该方法对于指定目录返回一个三元组(dirpath, dirnames, filenames),第一个是路径,第二個是路径下面的目录,第三个就是目录里面的非目录文件。代码如图5所示。
在进行了适当拓展后,基本完成“对答题卡识别”这一项目的编程实现。至此,笔者以完整项目为抓手,对浙教版必修1《数据与计算》 3.3节中的内容进行了再设计。
当然,从意识、思维、方法再到能力的过程不是一蹴而就的,需要有针对性地在课堂教学中加以培养。这里,教材也只是教师开展教学任务的参考,仅仅是一项优质资源,实际教学还要考虑各种实际情况来具体对待。
面对新课标、新教材所带来的新机遇和新挑战,教师要多从计算思维角度考虑,使教学内容的设计更具逻辑性,让计算思维凸显于项目化设计中,使计算思维能真正落地生根,更好地实现全面提升高中学生信息素养的重要目标。