Python的高級圖像處理
構(gòu)建圖像搜索引擎并不是一件容易的任務(wù)。這里有幾個概念、工具、想法和技術(shù)需要實現(xiàn)。主要的圖像處理概念之一是逆圖像查詢reverse image querying(RIQ)。Google、Cloudera、Sumo Logic 和 Birst 等公司在使用逆圖像搜索中名列前茅。通過分析圖像和使用數(shù)據(jù)挖掘 RIQ 提供了很好的洞察分析能力。
頂級公司與逆圖像搜索
有很多頂級的技術(shù)公司使用 RIQ 來取得了不錯的收益。例如:在 2014 年 Pinterest 第一次帶來了視覺搜索。隨后在 2015 年發(fā)布了一份白皮書,披露了其架構(gòu)。逆圖像搜索讓 Pinterest 獲得了時尚品的視覺特征,并可以顯示相似產(chǎn)品的推薦。
眾所周知,谷歌圖片使用逆圖像搜索允許用戶上傳一張圖片然后搜索相關(guān)聯(lián)的圖片。通過使用先進的算法對提交的圖片進行分析和數(shù)學(xué)建模,然后和谷歌數(shù)據(jù)庫中無數(shù)的其他圖片進行比較得到相似的結(jié)果。
這是 OpenCV 2.4.9 特征比較報告一個圖表:
算法 & Python庫
在我們使用它工作之前,讓我們過一遍構(gòu)建圖像搜索引擎的 Python 庫的主要元素:
專利算法
尺度不變特征變換Scale-Invariant Feature Transform(SIFT)算法
- 帶有非自由功能的一個專利技術(shù),利用圖像識別符,以識別相似圖像,甚至那些來自不同的角度,大小,深度和尺度的圖片,也會被包括在搜索結(jié)果中。點擊這里查看 SIFT 詳細(xì)視頻。
- SIFT 能與從許多圖片中提取了特征的大型數(shù)據(jù)庫正確地匹配搜索條件。
- 能匹配不同視角的相同圖像和匹配不變特征來獲得搜索結(jié)果是 SIFT 的另一個特征。了解更多關(guān)于尺度不變關(guān)鍵點。
加速魯棒特征Speeded Up Robust Features(SURF)算法
- SURF 也是一種帶有非自由功能的專利技術(shù),而且還是一種“加速”的 SIFT 版本。不像 SIFT,SURF 接近于帶有箱式過濾器Box Filter的高斯拉普拉斯算子Laplacian of Gaussian。
- SURF 依賴于黑塞矩陣Hessian Matrix的位置和尺度。
- 在許多應(yīng)用中,旋轉(zhuǎn)不變性不是一個必要條件,所以不按這個方向查找加速了處理。
- SURF 包括了幾種特性,提升了每一步的速度。SIFT 在旋轉(zhuǎn)和模糊化方面做的很好,比 SIFT 的速度快三倍。然而它不擅長處理照明和變換視角。
- OpenCV 程序功能庫提供了 SURF 功能,SURF.compute() 和 SURF.Detect() 可以用來找到描述符和要點。閱讀更多關(guān)于SURF點擊這里
開源算法
KAZE 算法
- KAZE是一個開源的非線性尺度空間的二維多尺度和新的特征檢測和描述算法。在加性算子分裂Additive Operator Splitting(AOS)和可變電導(dǎo)擴散中的有效技術(shù)被用來建立非線性尺度空間。
- 多尺度圖像處理的基本原理很簡單:創(chuàng)建一個圖像的尺度空間,同時用正確的函數(shù)過濾原始圖像,以提高時間或尺度。
加速的 KAZEAccelerated-KAZE(AKAZE) 算法
- 顧名思義,這是一個更快的圖像搜索方式,它會在兩幅圖像之間找到匹配的關(guān)鍵點。AKAZE 使用二進制描述符和非線性尺度空間來平衡精度和速度。
二進制魯棒性不變尺度可變關(guān)鍵點Binary Robust Invariant Scalable Keypoints(BRISK)算法
- BRISK 非常適合關(guān)鍵點的描述、檢測與匹配。
- 是一種高度自適應(yīng)的算法,基于尺度空間 FAST 的快速檢測器和一個位字符串描述符,有助于顯著加快搜索。
- 尺度空間關(guān)鍵點檢測與關(guān)鍵點描述幫助優(yōu)化當(dāng)前相關(guān)任務(wù)的性能。
快速視網(wǎng)膜關(guān)鍵點Fast Retina Keypoint(FREAK)
- 這個新的關(guān)鍵點描述的靈感來自人的眼睛。通過圖像強度比能有效地計算一個二進制串級聯(lián)。FREAK 算法相比 BRISK、SURF 和 SIFT 算法可以更快的計算與內(nèi)存負(fù)載較低。
定向 FAST 和旋轉(zhuǎn) BRIEFOriented FAST and Rotated BRIEF(ORB)
- 快速的二進制描述符,ORB 具有抗噪聲和旋轉(zhuǎn)不變性。ORB 建立在 FAST 關(guān)鍵點檢測器和 BRIEF 描述符之上,有成本低、性能好的元素屬性。
- 除了快速和精確的定位元件,有效地計算定向的 BRIEF,分析變動和面向 BRIEF 特點相關(guān),是另一個 ORB 的特征。
Python庫
OpenCV
- OpenCV 支持學(xué)術(shù)和商業(yè)用途,它是一個開源的機器學(xué)習(xí)和計算機視覺庫,OpenCV 便于組織利用和修改代碼。
- 超過 2500 個優(yōu)化的算法,包括當(dāng)前最先進的機器學(xué)習(xí)和計算機視覺算法服務(wù)與各種圖像搜索--人臉檢測、目標(biāo)識別、攝像機目標(biāo)跟蹤,從圖像數(shù)據(jù)庫中尋找類似圖像、眼球運動跟隨、風(fēng)景識別等。
- 像谷歌,IBM,雅虎,索尼,本田,微軟和英特爾這樣的大公司廣泛的使用 OpenCV。
- OpenCV 擁有 python,java,C,C++ 和 MATLAB 接口,同時支持 Windows,Linux,Mac OS 和 Android。
Python 圖像庫 (PIL)
- Python 圖像庫(PIL)支持多種文件格式,同時提供圖像處理和圖形解決方案。開源的 PIL 為你的 Python解釋器添加了圖像處理能力。
- 標(biāo)準(zhǔn)的圖像處理能力包括圖像增強、透明和遮罩處理、圖像過濾、像素操作等。
詳細(xì)的數(shù)據(jù)和圖表,請看這里的 OpenCV 2.4.9 特征比較報告。
構(gòu)建圖像搜索引擎
圖像搜索引擎可以從預(yù)置的圖像庫選擇相似的圖像。其中最受歡迎的是谷歌的著名的圖像搜索引擎。對于初學(xué)者來說,有不同的方法來建立這樣的系統(tǒng)。提幾個如下:
- 采用圖像提取、圖像描述提取、元數(shù)據(jù)提取和搜索結(jié)果提取,建立圖像搜索引擎。
- 定義你的圖像描述符,數(shù)據(jù)集索引,定義你的相似性度量,然后進行搜索和排名。
- 選擇要搜索的圖像,選擇用于進行搜索的目錄,搜索所有圖片的目錄,創(chuàng)建圖片特征索引,評估搜索圖片的相同特征,匹配搜索的圖片并獲得匹配的圖片。
我們的方法基本上從比較灰度版本的圖像,逐漸演變到復(fù)雜的特征匹配算法如 SIFT 和 SURF,最后采用的是開源的解決方案 BRISK 。所有這些算法都提供了有效的結(jié)果,但在性能和延遲有細(xì)微變化。建立在這些算法上的引擎有許多應(yīng)用,如分析流行統(tǒng)計的圖形數(shù)據(jù),在圖形內(nèi)容中識別對象,等等。
舉例:一個 IT 公司為其客戶建立了一個圖像搜索引擎。因此,如果如果搜索一個品牌的標(biāo)志圖像,所有相關(guān)的品牌形象也應(yīng)該顯示在搜索結(jié)果。所得到的結(jié)果也能夠被客戶用于分析,使他們能夠根據(jù)地理位置估計品牌知名度。但它還比較年輕,RIQ(反向圖像搜索)的潛力尚未被完全挖掘利用。
這就結(jié)束了我們的文章,使用 Python 構(gòu)建圖像搜索引擎。瀏覽我們的博客部分來查看最新的編程技術(shù)。