数字图像处理的一种新方法
2016-07-15李国军
李国军
(鞍山师范学院 物理科学与技术学院,辽宁 鞍山 114007)
数字图像处理的一种新方法
李国军
(鞍山师范学院 物理科学与技术学院,辽宁 鞍山 114007)
摘要以数字图像处理课程主要内容为例,探讨了Python语言在提取图像信息、提高图像质量和图像数据变换时的应用方法.主要包括:图像直方图、空间滤波、频率域滤波、边缘检测和形态学图像处理.应用表明,Python的处理方法简便灵活,表征数据图形直观明了,适合推广使用.
关键词Python;数字图像处理;课程应用
数字图像处理课程内容主要包括提高图像的视感质量(亮度、色彩、对比度、几何变换、图像增强和复原)、提取图像中所包含的某些特征(图像分割、图像信息描述、模式识别或计算机视觉)、图像数据的变换、编码和压缩等方面内容[1].在国内高等院校教学与科研中,其实验分析多用MATLAB、Visual C++和JAVA,且以MATLAB为主.Python是一种面向对象、支持动态语义、内置高级数据结构、语法简洁优美、易于扩展的解释型脚本语言(script language)[2].与MATLAB相比,Python是一门更易学、更严谨的程序设计语言,最重要的是其开源和免费.其扩展库NumPy相当于Matlab,它提供了矩阵、线性代数、傅里叶变换等的解决方法,还包含Fortran 代码集、C++代码集[3].虽然Python语言应用灵活、广范,但在数字图像处理中应用并不多见.为此,笔者以国内相关教材为参考[4],并省略实验的基本原理和实验公式的推导过程,主要借助开源跨平台计算机视觉库OpenCV(Open Source Computer Vision Library)已经实现了的图像处理和计算机视觉方面的通用算法[5],并且借鉴了PIL(Python Imaging Library Python,图像处理类库)的处理方法,突出表现Python语言数据分析处理、绘图的基本过程,推动Python在数字图像处理课程的应用研究.
1图像直方图
图像是由像素构成,图像直方图是反映一个图像像素分布的统计表.其横坐标代表了图像像素的种类,可以是灰度的,也可以是彩色的;纵坐标代表了每一种颜色值在图像中的像素总数或者占所有像素个数的百分比.在实际工程中,图像直方图在特征提取、图像匹配等方面都有很好的应用.OpenCV中利用calcHist方法完成图像直方图计算[6],本次研究中代码如下,其结果如图1.
img = cv2.imread('myson.jpg')
r,g,b=cv2.split(img) #利用通道分离技术,调整 cv2和pyplot图像色彩通道顺序#
img=cv2.merge([b,g,r])
plt.subplot(121),plt.imshow(img),plt.title("origin map")
color = ('b','g','r') #BGR三种颜色#
plt.subplot(122)
for i,col in enumerate(color):#循环画出直方图#
histr = cv2.calcHist([img],[i],None,[256],[0,256])
plt.plot(histr,color = col) #画直方曲线#
plt.xlim([0,256])
图1 实例原图与RGB三色图像直方图
2空间滤波
滤波是信号和图像处理中基本的任务,目的是根据应用环境的不同,选择性地提取图像中某些认为是重要的信息.空间滤波是一种采用滤波处理的影像增强方法.其理论基础是空间卷积.目的是改善影像质量,包括去除高频噪声与干扰.空域滤波器分为低通(平滑)滤波器和高通(锐化)滤波器,平滑滤波减弱傅立叶空间高频分量,用积分实现,锐化滤波减弱傅立叶空间低频分量,用微分实现[7].opencv 包中GaussianBlur 算法用于模糊,解决图像平滑一致问题;Sobel和Laplacian算法用于锐化,提高图像边缘清晰度问题.本次研究中Python使用GaussianBlur和Laplacian算法,代码如下,其结果如图2.
图2 Gaussian模糊(左)和Laplacian锐化(右)
img = cv2.imread("lena.png",0)
img = cv2.GaussianBlur(img,(3,3),0) # 用高斯平滑处理原图像降噪#
gray_lap = cv2.Laplacian(img,cv2.CV_16S,ksize = 3) # Laplacian滤波,经验参数ksize设为3 #
dst = cv2.convertScaleAbs(gray_lap)# 将其转回原来的uint8形式,否则将无法显示图像#
3频率域滤波
频率域滤波与空间滤波是对图像增强一个问题的两种殊途同归的方式[8].在分析图像信号的频率特性时,对于一幅图像,直流分量表示预想的平均灰度,低频分量代表了大面积背景区域和缓慢变化部分,高频部分代表了它的边缘、细节、跳跃部分以及颗粒噪声.截取频率的低频分量,对其作傅立叶反变换,得到的就是模糊后的图像;截取频率的高频分量,对其作傅立叶反变换,得到的就是锐化后的图像[9].opencv 包中DFT(Discrete Fourier Transform)和IDFT(inverse DFT)算法用于傅立叶变换.本次研究中同时利用了numpy包中fft.fftshift傅立叶变换函数[10],Python代码如下,其结果如图3.
img = cv2.imread('myson.jpg',0)
rows,cols = img.shape
crow,ccol = rows/2,cols/2 #取中心#
mask1 = np.zeros((rows,cols,2),np.uint8) #建立一个遮罩中心都是1,边缘都是0#
mask1[crow-30:crow+30,ccol-30:ccol+30] = 1
mask2 = np.ones((rows,cols,2),np.uint8) #建立一个遮罩中心都是0,边缘都是1#
mask2[crow-30:crow+30,ccol-30:ccol+30] = 0
dft = cv2.dft(np.float32(img),flags=cv2.DFT_COMPLEX_OUTPUT) # # 傅立叶变换,输入图像转成 np.float32型频谱#
dft_shift = np.fft.fftshift(dft)#反换位,低频部分移到四周,高频部分移到中间#
以热奈特狭义的互文性理论和超文性理论为基础,法国文论家萨莫瓦约在她的《互文性研究》一书中给互文手法作了如下分类:引用、暗示、抄袭、戏拟、仿作等。她指出互为文本性包含两种互文关系。第一种为“两个或多个文本之间的共生关系,”即“一篇文本在另一篇中切实地出现,”(萨莫瓦约,2003:36)包括引用、暗示、抄袭等;第二种为“派生关系,即一篇文本从另一篇文本中被派生出来,”(萨莫瓦约,2003:36)又叫超文性,包括戏拟和仿作,超文不一定直接引用源文本,但却是由源文本“引出”或“派生”出来的。戏拟是《爵士乐》的互文性特征之一,下文将对这一特征展开分析。
magnitude_spectrum = 20*np.log(cv2.magnitude(dft_shift[:,:,0],dft_shift[:,:,1]))
fshift1 = dft_shift*mask1 # 对遮罩和频谱进行IDFT#
fshift2 = dft_shift*mask2
f_ishift1 = np.fft.ifftshift(fshift1) #做数据反转#
f_ishift2 = np.fft.ifftshift(fshift2)
img_back1 = cv2.idft(f_ishift1)
img_back1 = cv2.magnitude(img_back1[:,:,0],img_back1[:,:,1]) #将频谱转换为可视图像#
img_back2 = cv2.idft(f_ishift2)
图3 频谱(Magnitude spectrum)图(左)、高通移去低频DFT图像(中)、低通移去高频IDTF图像(右)
4边缘检测
边缘检测是图像处理和计算机视觉中的基本问题,目的是标识数字图像中亮度变化明显的点,解决图像分割的问题[11].常见的算法包括:差分边缘检测、梯度边缘检测、ROBERT边缘检测[12].opencv包中有Canny算法、Sobel算法、Laplace算法,Scharr滤波器以及Hough直线检测可以完成相应的边缘检测.本次实验中笔者利用sobel和Canny边缘两种方法,并借助高斯模糊解决图像边缘检测问题[13].代码如下,其结果如图4.
img = cv2.imread("myson.jpg",0)
img = cv2.GaussianBlur(img,(3,3),0) # 用高斯平滑处理原图像降噪#
x = cv2.Sobel(img,cv2.CV_16S,1,0) #X轴sobel边缘检测#
y = cv2.Sobel(img,cv2.CV_16S,0,1) #y轴sobel边缘检测#
absX = cv2.convertScaleAbs(x) # 转回uint8,否则将无法显示图像#
absY = cv2.convertScaleAbs(y)
dst = cv2.addWeighted(absX,0.5,absY,0.5,0) #sobel边缘检测#
canny = cv2.Canny(img,50,150) #Canny边缘检测#
图4 sobel(左)和Canny(右)边缘结果图
5形态学图像处理
形态学(morphology)一词通常表示生物学的一个分支,该分支主要研究动植物的形态和结构[14].其基本的运算包括:二值腐蚀和膨胀、二值开闭运算、骨架抽取、极限腐蚀、击中击不中变换、形态学梯度、Top-hat变换、颗粒分析、流域变换、灰值腐蚀和膨胀、灰值开闭运算、灰值形态学梯度等[15].简单来讲,形态学操作就是基于形状的一系列图像处理操作.OpenCV为进行图像的形态学变换提供了morphologyEx方法,它利用基本的膨胀和腐蚀技术,来执行更加高级的形态学变换,如:开、闭运算,形态学梯度,“顶帽”“黑帽”等[16].代码如下,其结果如图5.
#coding=utf-8
import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('myson.jpg',0)
kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(5,5))#OpenCV定义的结构元素#
eroded = cv2.erode(img,kernel) #腐蚀图像#
dilated = cv2.dilate(img,kernel) #膨胀图像#
opened = cv2.morphologyEx(img,cv2.MORPH_OPEN,kernel) #开运算#
closed = cv2.morphologyEx(img,cv2.MORPH_CLOSE,kernel) #闭运算#
图5 腐蚀(eroded) 、膨胀(dilated)、开(opened)、闭(closed)运算运行结果图
6小结
从Python语言在数字图像处理课程中应用的几个方面中,可以看出Python使用快捷方便又不失基本理论的验证,可以很大程度上提高数字图像处理实验教学质量.此外C++ 、Java、MATHLAB 和Python都可免费调用OpenCV完成相应的图像处理功能[17].C ++书写代码最长,执行效率最高;Java书写代码比较长,执行效率也次之;MATHLAB 和Python的代码相当,但Python执行效率微高于MATHLAB.最重要的是Python是免费和开源的,相对而言是最值得应用和推广的.
参考文献
[1] 百度百科.数字图像处理[EB/OL].http://baike.baidu.com,2015-06-10.
[2] 百度百科.PYTHON[EB/OL].http://baike.baidu.com,2015-06-10.
[3] 张若愚.Python科学计算[M].北京:清华大学出版社,2012.
[4] Rafael C Gonzalez,Richard E Woods,Steven L Eddins.数字图像处理的MATLAB实现[M].阮秋琦译.北京:清华大学出版社,2013.
[5] Joseph Howse.OpenCV Computer Vision with Python[M].Birmingham:Packt Publishing,2013.
[6] sunny2038.计算并显示直方图[EB/OL].http://blog.csdn.net/sunny2038,2015-06-10.
[7] 张德丰.MATLAB数字图像处理[M].北京:机械工业出版社,2012.
[8] 孙燮华.数字图像处理Java编程与实验[M].北京:机械工业出版社,2011.
[9] 王宏,赵海滨.数字图像处理java语言实现[M].沈阳:东北大学出版,2005.
[10] niesu.离散傅立叶变换[EB/OL].http://www.opencv.org.cn,2015-06-10.
[11] Jan Erik Solem.Python计算机视觉编程[M].北京:人民邮电出版社,2014.
[12] 陈胜勇.基于OpenCV的计算机视觉技术实现[M].北京:科学出版社,2008.
[13] 毛星云.OpenCV边缘检测[EB/OL].http://blog.csdn.net/poem_qianmo,2015-06-10.
[14] 张铮.数字图像处理与机器视觉[M].北京:人民邮电出版社,2010.
[15] 张宏林.精通Visual C++数字图像处理典型算法及实现[M].北京:机械工业出版社,2009.
[16] Time waits for no one.形态学图像处理[EB/OL].http://www.cnblogs.com/xianglan,2015-06-10.
[17] SPHINX.OpenCV-Python Tutorials [EB/OL].http://opencv-Python-tutroals.readthedocs.org/en/latest/index.html,2015-06-10.
(责任编辑:张冬冬)
The discussion on the new method in digital image processing
LI Guojun
(School of Physical Science and Technology,Anshan Normal University,Anshan Liaoning 114007,China)
AbstractTaking the course of digital image processing as an example,this paper discusses the image information extraction,image quality enhance and image data transformation by using Python language.There are histogram,spatial filtering,frequency domain filtering,edge detection and morphological image processing in this paper.It shows that experimental data processing is simple and flexible by this method,data graphical is intuitive and convenient,and this method should be widely used.
Key wordsPython;digital image processing;course application
收稿日期2016-01-05
基金项目2014年辽宁省普通高等学校本科教育教学改革研究项目(UPRP20140403):面向工程实践,提高专业核心能力——电子类专业;2015年鞍山师范学院校级科研项目(15kjxm04):大学生教育机器人竞赛人才培养模式研究.
作者简介李国军(1968-),男,山东平度人,鞍山师范学院物理科学与技术学院高级实验师,硕士.
中图分类号G434
文献标识码A文章篇号1008-2441(2016)02-0069-05