人的眼睛是很容易接受視覺呈現的東西,同樣地,電腦視覺就是讓系統能夠理解並處理圖像。
Core Image 和 Vision 是 iOS 電腦視覺的兩大框架。在 WWDC 2020 中,Apple 為這兩個框架添加了許多新功能。
現在 iOS 14 的 Core Image,新增了一些內建的圖像處理濾鏡。舉例來說,其中一個新增的 CIColorThreshold
濾鏡,讓我們可以設定閾 (threshold) 值,來將圖像轉換為黑白。另外 CIColorThresholdOtsu
濾鏡,可以從圖像的直方圖 (histogram) 中確定合適的閾值。
更重要的是,我們現在可以使用一個新濾鏡 CIColorAbsoluteDifference
,來比較兩個圖像,這就是本篇文章的重點。
在文章接下來的部分,我們將看看不同的範例,來應用分析圖像差異這個濾鏡。
絕對圖像差異 (Absolute Image Difference)
在這個圖像處理範例中,我們想要計算兩個圖像上每個像素的絕對差異,並將其相加。
如此一來,我們就會得到一個轉換過的圖像,當中會顯示兩個圖像的差異。
在新的 Core Image 濾鏡中,如果兩個圖像完全相同,輸出圖像將為黑色。
利用比較圖像之間的色差這個功能,我們可以:
- 分析影像幀 (frame)。舉例來說,我們可以確定幀是否一致,或是檢查每一張幀會不會有一些陰影。
- 作異常檢測 (anamoly detection),來找出肉眼可能遺漏的異常情況。這對於找尋圖像之間的差異很有用,例如信用卡或紙幣的符號是否有缺。
接下來,我們將探討一些比較圖片的範例。
Core Image 濾鏡:CIColorAbsoluteDifference
首先,建立一個執行圖像處理的 SwiftUI App。
在 Core Image,我們需要設定一個輸入 CIImage
(我們會把圖象從 UIImage 轉換為 CIImage),並設置在 CIFilter
上。接著,我們就可以設置閾值(如有),並從濾鏡中取得 outputImage
實例。這個 outputImage
實例基本上是 inputImage 的副本,然後我們會把實例傳遞給 CIContext 的函數 createCGImage
中,以做轉換。
CIContext
就是執行圖像處理的地方。
在 SwiftUI 內找出圖像的差異
以下範例是典型「找出圖像差異」的情況,不過這次我們套用了電腦視覺。
我們用 CIFilter.colorAbsoluteDifference()
建構一個 CIFilter,並將兩個圖像傳遞給它。
我們也可以在比較前,將兩張照片轉換成灰階。
浮水印偵測/擷取
這也是一個非常常見的範例。如果你想要確認圖像是否已經疊加了浮水印或是 Logo,就可以使用 CIColorAbsoluteDifference
如下判別:
信用卡的異常偵測
在手機 App 掃描信用卡並擷取資訊,是一個常見的電腦視覺任務。
我們現在可以進一步應用上述的濾鏡,來判定信用卡的圖像有沒有被篡改。我們可以利用一個空白的信用卡圖像作參考,與一個掃描圖像來比較,以擷取所需的資訊。
看看以下範例,你會了解如何達到這兩個目標:
在左側圖像中,如果我們想更進一步使用電腦視覺全面偵測異常值,可以再將輸出圖像和一個不透明的黑色圖像作比較。
你可以在 Github 程式庫 上,找到文章中所有 SwiftUI + CoreImage App 的程式碼。
結論
在準備資料集 (data set) 時,Apple 的圖像處理框架 CoreImage 就可以大派用場,讓我們方便地進行圖像轉換與增強 (augmentation)。
在這篇文章中,我們討論了 iOS 14 的新濾鏡 CIColorAbsoluteDifference
,它讓我們可以不使用 OpenCV,來比對兩個圖像中每個像素的顏色。
這個濾鏡非常好用,讓我們從圖像中找出差異,或是從影像或資料庫判定和移除重複的圖像。
本篇文章到此為止。謝謝你的閱讀。