李志,陳入云
(廣東海洋大學(xué) 數(shù)學(xué)與計(jì)算機(jī)學(xué)院,廣東湛江 524088)
數(shù)字圖像處理是目前信息類專業(yè)普遍開設(shè)的一門專業(yè)方向課。其理論深?yuàn)W、實(shí)踐性強(qiáng),需要較好的算法理解能力和編程能力。通常,在大學(xué)開設(shè)該課程都會(huì)配置部分實(shí)驗(yàn)課時(shí),而實(shí)驗(yàn)課的算法實(shí)現(xiàn)以及理論課的效果演示多采用MATLAB[1-2]。
近年來,Python 作為一種免費(fèi)開源的編程語(yǔ)言,越來越受歡迎。在數(shù)字圖像處理方面Python 也有一些功能強(qiáng)大的擴(kuò)展庫(kù),且在相關(guān)聯(lián)的深度學(xué)習(xí)等方面具有很大的優(yōu)勢(shì)。目前,Python 在圖像處理領(lǐng)域的使用變得越來越普及,以Python 語(yǔ)言作為實(shí)驗(yàn)教學(xué)中的編程語(yǔ)言,已在一些院校得到應(yīng)用[3-4]。
Python 與MATLAB 都是解釋型的語(yǔ)言,語(yǔ)法簡(jiǎn)單,都能高效地進(jìn)行數(shù)值計(jì)算,都支持矩陣和向量運(yùn)算。在圖像處理方面,MATLAB 有強(qiáng)大的圖像處理工具箱,而Python 也有相應(yīng)的功能強(qiáng)大的擴(kuò)展庫(kù)。不管是利用現(xiàn)成的函數(shù),還是自編代碼完成圖像處理任務(wù),Python 都能輕松勝任。
Python 是開源免費(fèi)的程序語(yǔ)言,圍繞其開發(fā)的大多數(shù)擴(kuò)展庫(kù)都遵循開源的協(xié)議,使用成本小。學(xué)習(xí)者還可以通過學(xué)習(xí)源碼,加深對(duì)原理和算法的理解,有效提高編程能力和代碼質(zhì)量。而MATLAB 是收費(fèi)軟件,且大多數(shù)函數(shù)的底層是封裝起來的,使用者不能接觸實(shí)際的實(shí)現(xiàn)代碼。
Python 語(yǔ)言處理圖像可以用到的擴(kuò)展庫(kù)有Numpy、Matplotlib、Pillow、Scikit-mage、OpenCV。這些擴(kuò)展庫(kù)能極大地簡(jiǎn)化圖像處理的工作。
Numpy 庫(kù)提供基本的矩陣和數(shù)組運(yùn)算,及各種數(shù)學(xué)函數(shù)。還提供了傅里葉變換的模塊fft。
對(duì)圖像處理而言,Matplotlib 庫(kù)主要提供顯示圖像的功能,方便顯示多子圖以及圖像標(biāo)注。
Pillow 提供了基本的圖像讀取、顯示、寫入、幾何變換、基本圖形繪制、濾波、增強(qiáng)、顏色轉(zhuǎn)換、形態(tài)學(xué)操作等的相關(guān)函數(shù)或方法。
Scikit-image 常簡(jiǎn)稱為Skimage,用Numpy 數(shù)組表示圖像數(shù)據(jù),提供眾多功能模塊,可媲美MATLAB 的圖像處理工具箱。
OpenCV 是跨平臺(tái)的計(jì)算機(jī)視覺和機(jī)器學(xué)習(xí)軟件庫(kù)。由C/C++開發(fā),提供了Python 接口。相對(duì)Skimage,OpenCV 更強(qiáng)大,可實(shí)現(xiàn)工業(yè)級(jí)的應(yīng)用。
要滿足數(shù)字圖像處理的教學(xué)需要,可以使用Numpy 搭配Skimage,或者Numpy 搭配OpenCV。如果配合Jupyter notebook 一起使用,需導(dǎo)入Matplotlib 庫(kù),方便顯示圖像。
Python 代碼可以方便地形成獨(dú)立的可執(zhí)行文件,并兼容多種操作系統(tǒng)。Python 還是面向?qū)ο蟮耐ㄓ贸绦蜷_發(fā)語(yǔ)言,除了數(shù)值計(jì)算,也是目前人工智能、深度學(xué)習(xí)、數(shù)據(jù)分析等方面使用最多的語(yǔ)言。而數(shù)字圖像處理與人工智能等的聯(lián)系日益緊密[5-6],在圖像處理中使用Python 替代MATLAB 將有很大的優(yōu)勢(shì)。
為了使學(xué)生理解圖像處理的各種算法,了解算法的效果,掌握相關(guān)函數(shù)的用法,必須在教學(xué)中多做演示,并合理地安排實(shí)驗(yàn)內(nèi)容。以下是筆者在教材Rafael C. Gonzalez 等著的《Digital Image Processing》中用Python 實(shí)現(xiàn)的實(shí)驗(yàn)內(nèi)容。其中一部分作為上課時(shí)的演示內(nèi)容,一部分作為實(shí)驗(yàn)課的實(shí)踐環(huán)節(jié)。
Python 使用Numpy 數(shù)組表示圖像數(shù)據(jù),對(duì)圖像的處理就是對(duì)Numpy 數(shù)組的操作。而Matplotlib、Pillow、Skimage、OpenCV 都支持Numpy,都有讀寫顯示圖像的函數(shù)。
直接灰度變換就是對(duì)圖像數(shù)據(jù)的Numpy 數(shù)組的運(yùn)算。Pillow 的ImageOps 模塊中的函數(shù)equalize()可實(shí)現(xiàn)直方圖均衡化。Skimage 的exposure 模塊中的equalize_hist()、match_histograms()分別用于實(shí)現(xiàn)直方圖均衡化和直方圖匹配。OpenCV 中,使用calcHist()計(jì)算直方圖,equalizeHist()函數(shù)實(shí)現(xiàn)直方圖均衡化。
Pillow 庫(kù)中圖像對(duì)象的filter()方法或其ImageFilter模塊提供的濾波器方法可實(shí)現(xiàn)空域?yàn)V波。Skimage 的filters 模塊有大量的空域?yàn)V波函數(shù),OpenCV 也提供了大量的空域?yàn)V波函數(shù)。
Python 中Numpy 的fft 模塊用于實(shí)現(xiàn)快速傅里葉變換相關(guān)的運(yùn)算。OpenCV 中的dft2()和idft2()用于實(shí)現(xiàn)快速傅里葉變換和反變換。
頻域?yàn)V波包括低通濾波、高通濾波、帶通濾波、帶阻濾波、同態(tài)濾波等。與MATLAB 一樣,Python 沒有提供頻域?yàn)V波的現(xiàn)成的函數(shù),可簡(jiǎn)單地使用Numpy 的數(shù)組運(yùn)算和fft 模塊實(shí)現(xiàn)。
圖像復(fù)原包括去噪和退化圖像的恢復(fù)。去噪可用空域?yàn)V波或頻域?yàn)V波實(shí)現(xiàn)。退化圖像的恢復(fù)主要包括逆濾波、維納濾波、約束最小二乘方濾波等方法。Skimage 的restoration 模塊提供了均值濾波、雙邊濾波、總變差去噪、小波去噪、維納濾波等函數(shù)。也可根據(jù)算法原理直接編程實(shí)現(xiàn)逆濾波、維納濾波。
離散余弦變換可使用Scipy 的fft 模塊下的dct、idct、dctn、idctn 等函數(shù),也可以使用OpenCV 下的dct、idct 函數(shù)。哈達(dá)瑪變換可利用Scipy 的linalg 模塊下的hadamard 函數(shù)產(chǎn)生哈達(dá)瑪矩陣。小波變換可使用PyWavelets 軟件包實(shí)現(xiàn)。
形態(tài)學(xué)處理是圖像預(yù)處理和特征提取的重要工具。Skimage 的morphology 模塊中用于形態(tài)學(xué)操作。OpenCV 中也提供了相應(yīng)的函數(shù)。
圖像分割主要包括邊緣檢測(cè)、閾值分割、分水嶺算法、聚類與超像素分割等方法。
Skimage 的filters 模塊包含了邊緣檢測(cè)算子和閾值分割的功能;segmentation 模塊包含了分水嶺算法、聚類與超像素分割等算法,以及活動(dòng)輪廓分割、隨機(jī)walker 分割等算法。此外,transform 模塊中還包含了Hough 變換的相關(guān)函數(shù),可以檢測(cè)直線、圓、橢圓等。OpenCV 中同樣有眾多的函數(shù)可實(shí)現(xiàn)上述功能。
Skimage 的feature 模塊包含了查找斑點(diǎn)、canny 邊緣檢測(cè)、多種角點(diǎn)檢測(cè)、灰度共生矩陣、紋理特征、梯度直方圖等的函數(shù)。OpenCV 中除實(shí)現(xiàn)上述功能的函數(shù)外,還包含實(shí)現(xiàn)MSER、SIFT、SURF 以及ORB 等特征檢測(cè)的函數(shù)。
為了提高學(xué)生的學(xué)習(xí)能力及綜合應(yīng)用能力,應(yīng)給學(xué)生安排一些有實(shí)際應(yīng)用背景的問題,如人像的自動(dòng)背景虛化、自動(dòng)校正印刷品圖片的畸變、逆光攝影中的人臉檢測(cè)及增強(qiáng)等。這些問題有一定難度,可以讓學(xué)生分組協(xié)作,作為課程設(shè)計(jì)的內(nèi)容,并作為總評(píng)成績(jī)的一部分,以對(duì)學(xué)生進(jìn)行更全面的評(píng)價(jià)。
Python 是面向?qū)ο蟮某绦蛘Z(yǔ)言,相對(duì)MATLAB 而言學(xué)習(xí)難度稍大,在一些使用習(xí)慣上也有不同。筆者在近幾年的教學(xué)中,同時(shí)使用這兩種語(yǔ)言作為實(shí)驗(yàn)語(yǔ)言,總結(jié)了一些注意事項(xiàng)。
學(xué)生應(yīng)已學(xué)習(xí)過Python 的基本語(yǔ)法,以及Numpy和Matplotlib,這樣在實(shí)驗(yàn)中只需逐步學(xué)習(xí)使用Skimage、OpenCV 等擴(kuò)展庫(kù)即可。
在教學(xué)中,考慮到學(xué)生的實(shí)際編程基礎(chǔ),應(yīng)允許學(xué)生在Python 和MATLAB 中自行選擇,教師同時(shí)提供不同語(yǔ)言的實(shí)驗(yàn)內(nèi)容指導(dǎo)。
圖像處理中需要用到大量現(xiàn)成的函數(shù),部分學(xué)生對(duì)此不熟悉。但學(xué)習(xí)現(xiàn)成函數(shù)的用法不應(yīng)是實(shí)驗(yàn)課的重心,這些可以提供資料讓學(xué)生自學(xué),教學(xué)的重心是引導(dǎo)學(xué)生理解算法原理并形成一定的實(shí)際應(yīng)用能力。
所以,為了加深學(xué)生對(duì)算法原理的理解,提高學(xué)生的動(dòng)手能力,降低學(xué)生對(duì)現(xiàn)成函數(shù)的依賴,應(yīng)有意識(shí)地安排部分圖像處理任務(wù)由學(xué)生自己編程完成。如直接灰度變換、直方圖均衡化、圖像的空域?yàn)V波、頻域?yàn)V波、逆濾波、維納濾波、偽彩色處理、Huffman 編碼、算術(shù)編碼、邊緣提取等,其中難度較大的可設(shè)為選做。
MATLAB 中使用函數(shù)imshow()顯示圖像,能自適應(yīng)地顯示多種格式圖像。
Matplotlib 的pyplot 模塊(簡(jiǎn)記為plt)中的imshow( )函數(shù)默認(rèn)將灰度圖像顯示為偽彩色圖像,需要添加參數(shù)cmap='gray'才能顯示為灰度圖像,且其顯示亮度是經(jīng)過拉伸的,并非其真實(shí)亮度。
Skimage 的io 模塊中imshow()函數(shù)可以正常顯示灰度圖像,且不會(huì)自動(dòng)將其灰度范圍拉伸。但當(dāng)圖像數(shù)據(jù)是實(shí)數(shù)時(shí),其值若超出[0,1],則顯示為偽彩色圖像。
Numpy 中將圖像數(shù)據(jù)由實(shí)數(shù)類型轉(zhuǎn)換為uint8時(shí),是按截?cái)嗵幚淼?,?56,257 經(jīng)轉(zhuǎn)換后會(huì)變成0,1。所以,圖像數(shù)據(jù)img 轉(zhuǎn)換為uint8 前,需先執(zhí)行img[img<0]=0; img [img>255]=255,以得到正確范圍的轉(zhuǎn)換。
筆者在近三年的數(shù)字圖像處理的教學(xué)中改用Python 作為實(shí)驗(yàn)語(yǔ)言,經(jīng)逐步摸索總結(jié),取得了較好的教學(xué)效果。主要體現(xiàn)為以下幾點(diǎn):
(1)Python 的編程效率高,代碼量少,使用相關(guān)的模塊能簡(jiǎn)單地完成各種復(fù)雜的圖像處理任務(wù)。沒有對(duì)應(yīng)的現(xiàn)成函數(shù)時(shí),也能指導(dǎo)學(xué)生根據(jù)算法原理編程完成。使用Python 能很好地完成實(shí)驗(yàn)教學(xué)任務(wù)。
(2)學(xué)生學(xué)習(xí)使用Python 的熱情高、自主性強(qiáng)。在熟悉Python 環(huán)境下的圖像處理工具后,很多學(xué)生開始學(xué)習(xí)網(wǎng)上的一些開源的圖像處理項(xiàng)目,它們往往是用Python 編寫的。部分學(xué)生還接觸到了Tensorflow、Keras 等深度學(xué)習(xí)算法開發(fā)工具,開闊了眼界,也提高了能力。
(3)一個(gè)額外的收獲是,選用Python 做實(shí)驗(yàn)語(yǔ)言有利于學(xué)生就業(yè)。在學(xué)習(xí)和使用Python 處理圖像的過程中,學(xué)生得到了更多的鍛煉。從學(xué)生畢業(yè)實(shí)習(xí)的情況看,使用Python 處理圖像的學(xué)生更受企業(yè)歡迎,符合企業(yè)的需求,能更順利地找到理想的工作。
總之,Python 免費(fèi)開源,語(yǔ)法簡(jiǎn)單,有眾多的擴(kuò)展庫(kù)可以實(shí)現(xiàn)圖像處理的各種算法,是圖像處理編程的理想語(yǔ)言。在數(shù)字圖像處理教學(xué)中,Python 值得推廣,經(jīng)合理地安排實(shí)驗(yàn)內(nèi)容,能獲得良好的教學(xué)效果。
創(chuàng)新創(chuàng)業(yè)理論研究與實(shí)踐2022年10期