APP下载

Python在数字图像处理课程教学中的应用探索

2022-03-24李志陈入云

创新创业理论研究与实践 2022年10期
关键词:直方图图像处理编程

李志,陈入云

(广东海洋大学 数学与计算机学院,广东湛江 524088)

数字图像处理是目前信息类专业普遍开设的一门专业方向课。其理论深奥、实践性强,需要较好的算法理解能力和编程能力。通常,在大学开设该课程都会配置部分实验课时,而实验课的算法实现以及理论课的效果演示多采用MATLAB[1-2]。

近年来,Python 作为一种免费开源的编程语言,越来越受欢迎。在数字图像处理方面Python 也有一些功能强大的扩展库,且在相关联的深度学习等方面具有很大的优势。目前,Python 在图像处理领域的使用变得越来越普及,以Python 语言作为实验教学中的编程语言,已在一些院校得到应用[3-4]。

1 将Python作为图像处理实验语言的可行性

Python 与MATLAB 都是解释型的语言,语法简单,都能高效地进行数值计算,都支持矩阵和向量运算。在图像处理方面,MATLAB 有强大的图像处理工具箱,而Python 也有相应的功能强大的扩展库。不管是利用现成的函数,还是自编代码完成图像处理任务,Python 都能轻松胜任。

1.1 免费开源、使用成本低

Python 是开源免费的程序语言,围绕其开发的大多数扩展库都遵循开源的协议,使用成本小。学习者还可以通过学习源码,加深对原理和算法的理解,有效提高编程能力和代码质量。而MATLAB 是收费软件,且大多数函数的底层是封装起来的,使用者不能接触实际的实现代码。

1.2 众多的扩展库,满足功能需求

Python 语言处理图像可以用到的扩展库有Numpy、Matplotlib、Pillow、Scikit-mage、OpenCV。这些扩展库能极大地简化图像处理的工作。

Numpy 库提供基本的矩阵和数组运算,及各种数学函数。还提供了傅里叶变换的模块fft。

对图像处理而言,Matplotlib 库主要提供显示图像的功能,方便显示多子图以及图像标注。

Pillow 提供了基本的图像读取、显示、写入、几何变换、基本图形绘制、滤波、增强、颜色转换、形态学操作等的相关函数或方法。

Scikit-image 常简称为Skimage,用Numpy 数组表示图像数据,提供众多功能模块,可媲美MATLAB 的图像处理工具箱。

OpenCV 是跨平台的计算机视觉和机器学习软件库。由C/C++开发,提供了Python 接口。相对Skimage,OpenCV 更强大,可实现工业级的应用。

要满足数字图像处理的教学需要,可以使用Numpy 搭配Skimage,或者Numpy 搭配OpenCV。如果配合Jupyter notebook 一起使用,需导入Matplotlib 库,方便显示图像。

1.3 支持多平台,可移植性好

Python 代码可以方便地形成独立的可执行文件,并兼容多种操作系统。Python 还是面向对象的通用程序开发语言,除了数值计算,也是目前人工智能、深度学习、数据分析等方面使用最多的语言。而数字图像处理与人工智能等的联系日益紧密[5-6],在图像处理中使用Python 替代MATLAB 将有很大的优势。

2 图像处理的实验内容安排及可用的Python实现

为了使学生理解图像处理的各种算法,了解算法的效果,掌握相关函数的用法,必须在教学中多做演示,并合理地安排实验内容。以下是笔者在教材Rafael C. Gonzalez 等著的《Digital Image Processing》中用Python 实现的实验内容。其中一部分作为上课时的演示内容,一部分作为实验课的实践环节。

2.1 图像的数据结构、图像的读写显示

Python 使用Numpy 数组表示图像数据,对图像的处理就是对Numpy 数组的操作。而Matplotlib、Pillow、Skimage、OpenCV 都支持Numpy,都有读写显示图像的函数。

2.2 图像的灰度变换与直方图处理

直接灰度变换就是对图像数据的Numpy 数组的运算。Pillow 的ImageOps 模块中的函数equalize()可实现直方图均衡化。Skimage 的exposure 模块中的equalize_hist()、match_histograms()分别用于实现直方图均衡化和直方图匹配。OpenCV 中,使用calcHist()计算直方图,equalizeHist()函数实现直方图均衡化。

2.3 图像的空域滤波

Pillow 库中图像对象的filter()方法或其ImageFilter模块提供的滤波器方法可实现空域滤波。Skimage 的filters 模块有大量的空域滤波函数,OpenCV 也提供了大量的空域滤波函数。

2.4 图像的傅里叶变换与频域滤波

Python 中Numpy 的fft 模块用于实现快速傅里叶变换相关的运算。OpenCV 中的dft2()和idft2()用于实现快速傅里叶变换和反变换。

频域滤波包括低通滤波、高通滤波、带通滤波、带阻滤波、同态滤波等。与MATLAB 一样,Python 没有提供频域滤波的现成的函数,可简单地使用Numpy 的数组运算和fft 模块实现。

2.5 图像的复原

图像复原包括去噪和退化图像的恢复。去噪可用空域滤波或频域滤波实现。退化图像的恢复主要包括逆滤波、维纳滤波、约束最小二乘方滤波等方法。Skimage 的restoration 模块提供了均值滤波、双边滤波、总变差去噪、小波去噪、维纳滤波等函数。也可根据算法原理直接编程实现逆滤波、维纳滤波。

2.6 其他图像变换

离散余弦变换可使用Scipy 的fft 模块下的dct、idct、dctn、idctn 等函数,也可以使用OpenCV 下的dct、idct 函数。哈达玛变换可利用Scipy 的linalg 模块下的hadamard 函数产生哈达玛矩阵。小波变换可使用PyWavelets 软件包实现。

2.7 形态学处理

形态学处理是图像预处理和特征提取的重要工具。Skimage 的morphology 模块中用于形态学操作。OpenCV 中也提供了相应的函数。

2.8 图像分割

图像分割主要包括边缘检测、阈值分割、分水岭算法、聚类与超像素分割等方法。

Skimage 的filters 模块包含了边缘检测算子和阈值分割的功能;segmentation 模块包含了分水岭算法、聚类与超像素分割等算法,以及活动轮廓分割、随机walker 分割等算法。此外,transform 模块中还包含了Hough 变换的相关函数,可以检测直线、圆、椭圆等。OpenCV 中同样有众多的函数可实现上述功能。

2.9 特征提取

Skimage 的feature 模块包含了查找斑点、canny 边缘检测、多种角点检测、灰度共生矩阵、纹理特征、梯度直方图等的函数。OpenCV 中除实现上述功能的函数外,还包含实现MSER、SIFT、SURF 以及ORB 等特征检测的函数。

2.10 综合实验

为了提高学生的学习能力及综合应用能力,应给学生安排一些有实际应用背景的问题,如人像的自动背景虚化、自动校正印刷品图片的畸变、逆光摄影中的人脸检测及增强等。这些问题有一定难度,可以让学生分组协作,作为课程设计的内容,并作为总评成绩的一部分,以对学生进行更全面的评价。

3 Python用于图像处理实验课的注意事项

Python 是面向对象的程序语言,相对MATLAB 而言学习难度稍大,在一些使用习惯上也有不同。笔者在近几年的教学中,同时使用这两种语言作为实验语言,总结了一些注意事项。

3.1 学生的编程基础

学生应已学习过Python 的基本语法,以及Numpy和Matplotlib,这样在实验中只需逐步学习使用Skimage、OpenCV 等扩展库即可。

在教学中,考虑到学生的实际编程基础,应允许学生在Python 和MATLAB 中自行选择,教师同时提供不同语言的实验内容指导。

3.2 以理解算法为实验课的重心

图像处理中需要用到大量现成的函数,部分学生对此不熟悉。但学习现成函数的用法不应是实验课的重心,这些可以提供资料让学生自学,教学的重心是引导学生理解算法原理并形成一定的实际应用能力。

所以,为了加深学生对算法原理的理解,提高学生的动手能力,降低学生对现成函数的依赖,应有意识地安排部分图像处理任务由学生自己编程完成。如直接灰度变换、直方图均衡化、图像的空域滤波、频域滤波、逆滤波、维纳滤波、伪彩色处理、Huffman 编码、算术编码、边缘提取等,其中难度较大的可设为选做。

3.3 Python 与MATLAB 的若干相似函数的差异

MATLAB 中使用函数imshow()显示图像,能自适应地显示多种格式图像。

Matplotlib 的pyplot 模块(简记为plt)中的imshow( )函数默认将灰度图像显示为伪彩色图像,需要添加参数cmap='gray'才能显示为灰度图像,且其显示亮度是经过拉伸的,并非其真实亮度。

Skimage 的io 模块中imshow()函数可以正常显示灰度图像,且不会自动将其灰度范围拉伸。但当图像数据是实数时,其值若超出[0,1],则显示为伪彩色图像。

Numpy 中将图像数据由实数类型转换为uint8时,是按截断处理的,如256,257 经转换后会变成0,1。所以,图像数据img 转换为uint8 前,需先执行img[img<0]=0; img [img>255]=255,以得到正确范围的转换。

4 将Python作为实验语言的教学效果

笔者在近三年的数字图像处理的教学中改用Python 作为实验语言,经逐步摸索总结,取得了较好的教学效果。主要体现为以下几点:

(1)Python 的编程效率高,代码量少,使用相关的模块能简单地完成各种复杂的图像处理任务。没有对应的现成函数时,也能指导学生根据算法原理编程完成。使用Python 能很好地完成实验教学任务。

(2)学生学习使用Python 的热情高、自主性强。在熟悉Python 环境下的图像处理工具后,很多学生开始学习网上的一些开源的图像处理项目,它们往往是用Python 编写的。部分学生还接触到了Tensorflow、Keras 等深度学习算法开发工具,开阔了眼界,也提高了能力。

(3)一个额外的收获是,选用Python 做实验语言有利于学生就业。在学习和使用Python 处理图像的过程中,学生得到了更多的锻炼。从学生毕业实习的情况看,使用Python 处理图像的学生更受企业欢迎,符合企业的需求,能更顺利地找到理想的工作。

总之,Python 免费开源,语法简单,有众多的扩展库可以实现图像处理的各种算法,是图像处理编程的理想语言。在数字图像处理教学中,Python 值得推广,经合理地安排实验内容,能获得良好的教学效果。

猜你喜欢

直方图图像处理编程
符合差分隐私的流数据统计直方图发布
编程,是一种态度
元征X-431实测:奔驰发动机编程
编程小能手
纺织机上诞生的编程
基于ARM嵌入式的关于图像处理的交通信号灯识别
用直方图控制画面影调
基于图像处理的机器人精确抓取的设计与实现
机器学习在图像处理中的应用
中考频数分布直方图题型展示