李振江
摘 要:為了更好地開展數字圖像處理課程的教學,教師應在分析課程實際需求以及語言特點的基礎上,將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