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

2018-01-03 22:09李振江
求知导刊 2017年24期
关键词:直方图调用灰度

李振江

摘 要:为了更好地开展数字图像处理课程的教学,教师应在分析课程实际需求以及语言特点的基础上,将Python选为课程实践语言,在引入Python数字图像处理基本知识的基础上,对一些最基本的图像处理算法进行实现。文章就此对Python在数字图像处理课程教学中的应用进行了分析。

一、引言

数字图像处理是一门综合性多领域交叉的学科,经过多年的发展,已经在机器视觉、自动控制、虚拟现实等领域取得了长足的发展。很多院校都在本科阶段开设了相关课程,其教学目的在于让学生了解数字图像处理的一般概念,掌握该领域最基本的算法原理以及实现方法,为进一步的学习打下基础。

在该课程的教学实践中,教师选择一门合适的语言工具进行授课尤为重要。语言工具的选择要注意这样几个问题;首先,语言要易于上手,这样才能让学生较快进入图像处理知识的学习而不是在一些编程细节上占用过多时间;其次,选择的语言要与当前新技术有较好的结合,这样在学习过程中才有助于开拓学生视野;最后,语言的扩展性要强,便于学生日后快速在其他相关领域展开学习应用。

二、Python语言的特点

1.简单易用

Python是一种面向对象的解释型语言,在其丰富外部库的支持下,实现数字图像处理的基本算法,通常都只需要不多的几行代码,非常方便。一方面,编程能力较低的本科学生使用Python语言也可以对课程内容进行实现;另一方面,在具体实践中能让学生从烦琐的底层逻辑(如IO操作、显示等)中摆脱出来,专注于图像处理的方法层面。从培养学生学习兴趣的角度讲,与早期选择使用的C++等语言相比,大部分学生都能使用Python完成基本算法的实现并将结果图像进行显示,这在初期对学生的学习兴趣是一种极大的鼓舞。

2.应用广泛

Python自20世纪90年代初诞生到现在,在各个领域都得到了广泛的应用。最初它的应用较为局限,大都以系统管理和web编程这两个方面为主。在该语言诞生之初,其一个核心的思想就是开放和开源,在众多开源社区的支持下,自2004年以来,Python的使用率有一个明显的增长。2017年IEEE Spectrum发布了第四届顶级编程语言交互排行榜,Python高居排行榜榜首,说明时下Python语言又成为业界应用的热点。尤其是在科学计算领域,随着深度学习技术引发的人工智能新一轮热潮,众多的代码都是基于Python语言进行发布,给这一领域传统的霸主MATLAB带了来巨大的挑战。

3.扩展性强

Python语言功能强大,有“胶水语言”的别称,能够方便地对其他语言实现的功能模块进行调用。对于某一具体问题,可以使用Python搭建整体框架,然后在不同的位置调用已有的成熟模块进行实现,是一种快速的软件实现方法。同时Python语言的扩展库数目繁多,在很多不同的应用领域,都有相应的库与之配合,如数学工具库NumPy、图形库Tkinter或者PIL、多媒体封装库PyOpenGL、数据库接口MySQLdb、机器学习库scikit-learn等。

结合数字图像处理课程本身的需求以及Python语言的自身特点,选择Python作为课程讲授的语言是较为符合实际需求的。同时,为了便于以后在数字图像处理方面的进一步学习,使用了OpenCV的Python库作为主要的图像处理工具,同时使用NumPy作为基础的数学库。

三、Python数字图像处理基础

1.Python的安装和库的导入

有两种方式对Python进行安装,使用第一种方式,在官网下载相应操作系统的安装包对语言本体进行安装,之后根据应用的需求下载相应的库,手工对其进行安装配置。第二种方式则是直接选用第三方的集成安装管理环境对其进行安装。由于Python功能库数目较多,且很多库与库之间还存在依赖关系,对于初学者建议使用第二种方式进行安装,推荐使用的安装工具为Anaconda,该工具可以一键式安装Python并对功能库进行集成化管理。在熟悉使用后,还可以使用第一种方式重新安装一次,以便进一步加深对Python开发中使用到各种工具以及库的理解。预装好的Anaconda中没有OpenCV,还需要在Anaconda的库管理工具中对OpenCV进行安装。安装完成后,在代码中使用import命令导入相应的库,就可以方便地使用库的相关功能。

2.图像的读取、显示以及保存

载入、显示并保存图像是数字图像处理的最基本操作,对于常见的各种图像格式,Python的OpenCV库都能对其进行较好的支持,其代码如下所示:

import cv2

img = cv2.imread('d:/1.bmp')

cv2.imshow('title', img)

cv2.waitKey(0)

cv2.destroyAllWindows()

cv2.imwrite('d:/1.jpg',img)

第一行代码为引入OpenCV库,后空一行,开始对图像进行读取以及显示。第三行中,使用imread方法讀取了一幅图像,将该图像赋值给变量img。第四行调用imshow方法绘制窗口并显示图像。第五行是对窗口的阻塞式显示,第六行销毁了所有窗口。第七行调用imwrite方法保存图像,这里的文件后缀由原始的bmp变为jpg,该方法可以根据文件后缀自动判别所需要保存的文件类型。

3.图像的像素操作

图像基本的像素操作包括像素值的读取与写入,在OpenCV中,一幅图像被看作一个数值矩阵,矩阵中点的值就是对应位置像素的值,所有和矩阵相关的操作都是调用NumPy库来进行处理的,其代码如下所示:

img = cv2.imread('d:/1.bmp')endprint

pixel = img[1,1,0]

print (pixel)

pixel = 10

img[1,1,0] = 10

print (img[1,1,0])

首先读取一幅图像,之后使用方括号索引对指定位置的像素进行读取,在上述代码中,索引位置为“[1,1,0]”,表示要读取的像素坐标为“1,1”,颜色通道为第0号通道。之后将数值10重新赋给这个坐标位置,同时将数值进行控制台输出,以便观察变化。除了以单个的方式对像素进行读写外,还可以以某一坐标范围对像素进行批量处理。

四、基本的图像处理算法

1.直方图处理

灰度直方图是图像不同灰度级出现概率的统计,通过直方图可以非常直观地了解一幅图像的明暗程度以及色彩均匀程度,是多种空间域处理技术的基础。我们可以调用calcHist方法来计算一幅图像的灰度直方图,并调用matplotlib库的相关方法对其进行显示。同时,对于灰度级分布不均匀的图像,可以使用直方图均衡化方法对图像进行增强,调用equalizeHist方法即可实现该操作。相关代码如下:

import cv2

import matplotlib.pyplot as plt

img = cv2.imread('d:/1.jpg',0) # 直接读为灰度图像

hist_cv = cv2.calcHist([img],[0],None,[256],[0,256]) # 计算灰度直方图

plt.plot(hist_cv) # 使用matplotlib显示直方图

res = cv2.equalizeHist(img) # 对原始图像进行直方图均衡化计算

plt.subplot(121),plt.imshow(img,'gray') # 对比显示均衡化前后的图像

plt.subplot(122),plt.imshow(res,'gray')

plt.show

2.空间滤波

空间滤波是由一个邻域模板对原始图像进行卷积操作,将卷积的结果代替该位置的像素,以达到某种处理的效果。最常见的滤波方式有两种,一种是空间平滑滤波,常用于模糊处理和降噪处理;还有一种是空间锐化滤波,常用于突出边缘操作。以下代码演示了使用均值滤波器进行平滑滤波以及使用Sobel滤波器进行锐化滤波。

import cv2

img = cv2.imread(d:/1.jpg',0) # 直接读为灰度图像

blur = cv2.blur(img,(5,5)) # 使用5*5的模板對图像进行中值滤波

sobelx = cv2.Sobel(img, cv2.CV_64F, 1, 0) # 分别沿着x和y方向计算sobel图像

sobely = cv2.Sobel(img, cv2.CV_64F, 0, 1)

sobelx = numpy.uint8(numpy.absolute(sobelx)) # 将计算得到的图像转换为uint8类型

sobely = numpy.uint8(numpy.absolute(sobely))

sobelcombine = cv2.bitwise_or(sobelx, sobely) # 合并两个方向的图像 得到最终的滤波结果

3.图像分割

图像分割是将图像的前景或感兴趣区域从背景中提取出来的一种技术手段,是从图像中提取相关语义信息的必要步骤。目前图像分割的技术手段多种多样,最基本的图像分割即图像的二值化处理,将整个图像划分为前景和背景两个部分。我们可以使用手工阈值方法对图像进行二值化处理,还可以使用自动阈值方法对其二值化。以下代码演示了使用手工阈值方法以及经典的自动阈值方法Otsu对图像进行二值化分割。

import cv2

img = cv2.imread('d:/dd.jpg', 0) # 读取灰度图像

ret1, bwimg1 = cv2.threshold(img,127,255,cv2.THRESH_BINARY) # 手工阈值进行二值化

ret2,bwimg2 = cv2.threshold(img,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU) # Otsu二值化

五、小结

在数字图像处理课程的教学过程中,选择Python作为实践教学使用的程序语言,一方面,降低了数字图像处理编程的学习门槛,提高了学生的学习积极性;另一方面,该语言与目前热门技术结合紧密,扩展性强,为以后的相关学习打下基础。本文简单介绍了该语言在教学过程中的基本应用手段,如何在此基础上进一步进行学习还有待研究。

参考文献:

[1]周海芳.“数字图像处理”课程研讨式教学[J].计算机教育,2010(24).

[2]李国军.数字图像处理的一种新方法[J].鞍山师范学院学报,2016(18).endprint

猜你喜欢
直方图调用灰度
天津港智慧工作平台灰度发布系统和流程设计
华为“灰度”哲学
Arduino小车巡线程序的灰度阈值优化方案
用直方图控制画面影调
基于Android Broadcast的短信安全监听系统的设计和实现
例析频率分布直方图
中考频数分布直方图题型展示
利用RFC技术实现SAP系统接口通信
一种基于灰度分割的调焦评价函数
C++语言中函数参数传递方式剖析