喻浩,吳豐林
(電子科技大學成都學院 智能制造工程系,四川成都, 611731)
在日新月異的當代社會,經濟和科技的快速發展使得人們的物質文化生活也越來越多元化。為了使得后來者也能見證某一特定的時間節點或保留某一美好的場景,人們常會通過拍照的方式將場景以圖片的形式進行保留。然而在日常生活中,人們常常會遇到對同一運動的物體進行快速多次拍攝取證后,產生模糊無效圖片的情況。若選擇后期以人工方式挑選時,則需要花費大量時間和精力對相關圖片進行逐一比對,不利于以人為本的發展思想的體現和勞動效率的提升。因此,隨著現代科學技術的快速發展,我們也應該不斷用探索用新的方式來解決日常生活以及工作應用中的此類繁瑣、單一、重復性的工作,從而提高工作效率和解放生產力。
通過查閱資料可知,當前國內外針對模糊圖像的識別處理方法主要存在以下缺點:(1)算法僅針對某一特定圖片進行模糊與否的判斷,不能批量識別并處理模糊圖片。當需要對其他圖片進行識別處理時,需要更改算法或者手動控制更換圖片;(2)利用圖像分割算法,建立由多尺度輸入的U形網絡和一組多尺度特征提取器構建的模型檢測和判定模糊圖像[1]。該方法識別較為準確但是構建模型過程復雜且難度較高,不利于推廣;(3)先對模糊圖片進行濾波等清晰化處理,再將處理后的圖片加以利用。該方案也僅能對單一圖像進行處理,不具有批量處理圖片的能力。且在不斷迭代的眾多算法中,哪一種算法更能行之有效地解決實際問題,還需要在更多的實際案例中不斷地進行檢驗,發現問題并加以優化。針對以上問題,本算法設計采用拉普拉斯算子對圖像進行模糊度判別,通過Python語言編寫批量識別處理模糊圖片的算法邏輯,從而達到本算法的設計目的。
區分清晰圖片和模糊圖片的基本思想為:圖像中各線條之間的邊緣不明確,且圖像中邊緣模糊的部分占圖片大部分,有小部分線條模糊的圖片不能判定為模糊圖片。因此,在機器學習領域可以通過拉普拉斯算法來檢測圖片是否模糊。即利用拉普拉斯算法在輸入圖片中查找圖像邊緣[2],計算圖像方差和已過濾圖像像素值的最大值。方差值大表明圖像邊緣清晰可見,即可判定為圖像清晰;若圖像方差值小則判定為圖像模糊。批量處理圖像的基本思想為:通過讀取目標文件夾預存圖片信息過程中保留圖片張數信息,以便算法進行和圖片張數相同次數的循環處理,從而達到遍歷所有圖片的目的。同時,在圖片遍歷過程中調用拉普拉斯算法計算圖片方差值,用于與閾值進行比較,達到清晰與模糊的判別目的。再通過自主編寫的功能函數doWork()進行相應的標記處理,以此達到批量處理的目的。為了給使用者更加直觀便捷地了解處理結果,特采用matplotlib.pyplot繪制可視化界面[3],將處理后的圖片以cv2.imwrite()函數另存文件夾的同時以彈窗形式進行集中展示。為了便于調試和檢驗該算法設計是否有效,本次驗證過程僅使用對運動的同一物體快速抓拍后的12張圖片進行調試和驗證處理。后續實際應用過程中若想批量處理更多的圖片,即在目標圖像庫添加預處理目標圖像即可。
拉普拉斯算法又稱為拉普拉斯梯度函數。理解梯度函數需要理解梯度的作用:梯度表示某一個函數在某一點的方向導數沿著該點方向的最大值,即函數在該點沿著該方向變化速度最快,變化率最大。本次設計過程即調用 OpenCV庫內置的拉普拉斯函數計算圖片的方差值,再在后續處理過程中判定圖片是否模糊[4]。該算法的主要思想為:先將圖像轉換為灰度圖像,然后單一通道的灰度圖像經過剛才計算出來的拉普拉斯 3×3 卷積核計算后會得到一個響應圖,最后再計算這個響應圖的方差?;谠摲讲詈皖A先經過調試設定的閾值進行比較,就可以判斷圖像是否模糊,也即是通過圖像灰度數據的方差來衡量圖像的清晰度。對于同一對象的一組圖片,可以采用同一個閾值進行判定;不同的對象、不同環境下拍攝的圖片可能需要根據實際情況相應的調整閾值。拉普拉斯梯度函數與使用Tenengrad梯度方法計算圖像梯度值的使用方式基本一致,Tenengrad梯度方法為利用Sobel算子分別計算水平和垂直方向的梯度,若圖像在同一背景條件下的梯度值越高,表明圖像越清晰。即衡量的指標是經過Sobel算子處理后的圖像的平均灰度值,值越大代表圖像越清晰。在使用時可直接用拉普拉斯梯度函數替代Sobel算子[5]。在圖像處理的應用方面,因平面圖像可以視為x和y兩個方向的像素點聚集排列而成且是離散分布的,所以需要將拉普拉斯算子方程表示為其在x,y兩個方向的離散形式。
其離散一階微分方程為:

其離散二階微分方程為:

拉普拉斯算子的離散方程為:

轉換為卷積核表示如下:

而基于拉普拉斯梯度函數的圖像清晰度的定義如下所示:

其中G(x,y)是像素點(x,y)處拉普拉斯算法的卷積,T是預先給定的邊緣檢測閾值。
Matplotlib是Python的一個繪圖庫,是Python語言中最常用的可視化工具之一,可以非常方便地創建2D圖表和一些簡單的3D圖表[6]。且能夠以各種硬復制格式和跨平臺的交互式環境生成出版質量級別的圖形[7]。在通過Matplotlib進行繪圖操作時,使用者可以僅依靠編寫幾行代碼便可以生成所需要的條形圖、餅圖、功率譜、直方圖、散點圖等。同時,它還提供了一套和Matlab類似的命令API,十分適合交互式地進行制圖,而且也可以方便地將它作為繪圖控件,嵌入GUI應用程序中[8]。本次算法設計即利用Matplotlib中plt工具繪制可視化界面,將處理結果以彈窗形式展示出來。涉及的函數簡介如圖1所示。

圖1 plt函數介紹
圖片的遍歷邏輯通過Python語言構建,該過程在自主編寫的功能函數matplotlib_multi_pic1()中實現。通過cv2.imread()函數讀取圖片,其形參images的值由(Pathimages+'/'+imgList[i])得 到。Pathimages為 圖 片庫的絕對路徑,通過主動賦值得到。imgList[i]的值通過os.listdir(path)函數賦值得到。os.listdir(path)函數作用是得到指定路徑下所有文件和文件夾的名字,并可將其存放于列表中,以此便得到了圖片命名信息。通過len(imgList)即可得到圖片數量,借助該數值進行相應次數的For循環,即可完成圖片庫的遍歷過程。
(1)對圖片信息進行采集。該過程是利用os.listdir()函數讀取圖片相關路徑信息并賦值給自定義變量imgList。變量imgList其作用是以形參的形式為自定義函數matplotlib_multi_pic1()提供圖片參數信息,使該函數在對圖片進行批量處理過程得到圖片參數信息,以使得處理后的圖片在另存文件夾時能保留原文件命名方式和利用len(imgList)語句得到圖片數量,以便于進行相應次數的圖片遍歷。
(2)通過PathImage = r'image/'語句得到目標圖片庫的絕對路徑,其作用是為函數matplotlib_multi_pic1()提供形參的值,以便于doWork()函數對某一具體圖片進行相應處理。
(3)調用matplotlib_multi_pic1()函數。其具體流程及作用為:該函數有形參imgList和PathImage,在該函數中,imgList提供的值用于得到遍歷次數和為圖片提供命名信息;PathImage提供圖片絕對路徑,以便于doWork()函數讀取并處理具體的圖片。同時在該函數中設置for循環對圖片進行遍歷。
(4)調用自定義的doWork()函數。該函數的具體流程及作用為:讀取圖片并將其轉換為灰度圖,將灰度圖傳遞至variance_of_laplacian()函數中,使用OpenCV庫自帶的函數cv2.Laplacian()進行拉普拉斯方差值計算,得到圖片具體的方差值。將得到的方差值與模糊閾值相比較判斷其是否為模糊圖片,若方差值大于閾值則可判定其清晰并標記為“Not Blurry”,小于閾值則可判定為模糊圖片并標記為“Blurry”,最后返回處理完成的圖片。其中,標記文字的過程利用cv2.FONT_HERSHEY_SIMPLEX命令實現,利用cv2.putText()函數對圖片進行處理結果展示。
整個算法實現即為各個函數互相調用的結果,程序運行過程如圖2所示。

圖2 程序運行流程圖
當用戶在圖像目標庫image文件夾中存入需要批量檢測的圖像源文件后,即可直接運行該算法進行模糊圖像批量檢測處理的任務。目標圖像庫預留文件方式如圖3所示。

圖3 目標圖像庫
在該算法運行完成后,即主動彈出可視化彈窗供用戶可在不打開圖像處理后另存文件夾User的條件下,直接對檢測處理完成的結果進行比對,以便呈現出更加直觀的處理效果。在彈出的效果圖中每一塊小區域的圖片左上角均標記有相應圖片通過拉普拉斯算法計算出的圖像方差的具體值,如果該值大于預先設定的閾值80就會標記 NotBlurry和計算出的,如果小于80 就會顯示 Blurry和圖像具體方差值。這樣就能夠非常直觀地看到所有圖片經過拉普拉斯算法計算得到的具體方差值和設定的比較標準之間的信息,由此方便后續數據的進一步處理和使用??梢暬瘡棿靶Ч鐖D4所示。

圖4 可視化彈窗效果
通過Python編寫語言邏輯,可以使得算法在處理單張圖片過程完成后即主動向User文件夾存放處理完成的圖片的功能循環。處理完成后的圖片左上角均標記有該圖像是否模糊以及圖像方差值具體參數。根據實際應用需要,也可以通過修改Python語言邏輯實現僅對判別出的模糊圖片進行標記處理,清晰圖片僅識別而不標記的功能,從而達到保護清晰圖像的目的。修改方法簡單,將清晰圖片對應的閾值比較語句下實現標記內容的文本text和圖像方差值fm屏蔽即可,即不對圖像方差值高于閾值的圖片進行標記處理。為了更好地驗證算法處理結果是否準確,在本次算法驗證過程中采用全部標記處理的方式驗證最終結果。圖像批量處理后得到的文件夾User如圖5所示。

圖5 圖像批量處理后得到的文件夾
為了更好地展示本算法的圖片分辨及標記處理效果,特單獨拿出處理后的模糊圖像和清晰圖像各一張進行對比。通過對比可以發現,清晰的圖像方差值高,模糊的圖像方差值低,且標記無誤。圖像對比如圖6所示。

圖6 圖像對比
本文設計并實現了基于拉普拉斯算子的模糊圖片批量檢測算法。經過實際應用檢驗,表明該算法設計在批量處理圖片過程中具有算法運行速度快、模糊與清晰圖片判別準確且自動另存處理后的圖像命名無誤等特點。不過該算法也還有一定的不足,即還未能實現將標記處理完成后的模糊與清晰的圖片自動分類存放[9]的功能。后期若能對該算法進行更進一步的優化,則可考慮如何設計更加優良的算法邏輯以實現該功能。不過,就目前該算法批量識別并處理模糊圖片的能力而言,也已具有一定的實際應用價值。后期若能在該基礎上更進一步研究,則一定能擁有更廣闊的應用前景和發揮更大的作用。