數字圖像處理(7):爬蟲建立數據庫並實現圖像檢索


本週的實驗我與llk同學合作完成,他負責爬蟲建立數據庫,我負責進行圖像檢索。最終實現成果爲:

llk同學通過爬蟲對某個關鍵詞爬百度圖片網頁,對其中的圖片進行保存,轉換爲.bmp格式文件,圖像大小調整爲200*150像素,以此建立數據庫。

我使用MFC設計應用程序,在其中加入彩色直方圖圖像檢索功能,在llk同學建立的數據庫裏進行圖像檢索,最後按照相似度進行排序展現。

爬蟲建立數據庫

爬蟲獲取圖像如果要編寫能夠通過輸入的關鍵詞自動在網絡中搜索相關圖片的程序比較複雜,這裏用Python編寫一個相對簡單的爬蟲程序,它自動加載百度的圖片搜索頁面,從中提取圖片鏈接,並下載圖片。在python的標準庫中有urllib可以向網站發送HTTP請求並接收網頁文件,但是用它得到的百度網頁不包含我們想要的圖片鏈接,因爲百度中很多網頁元素是根據腳本動態生成的,urllib直接獲取的文件包含了這些腳本的代碼信息卻沒有加載它們。這裏用了一個Python的第三方庫Selenium,它不但可以驅動瀏覽器動態加載頁面,而且可以執行我們編寫的Javascript腳本。通過Javascript可以實現網頁的下拉刷新和翻頁,從而搜索更多圖片。

百度搜圖頁面默認是採用“瀑布流版本”,頁面滑動到底端才繼續加載,每次只能從頭開始,也不太好控制搜索的圖片數量,所以選擇了傳統的翻頁版本。翻頁其實就是向另一個頁面的鏈接跳轉,頁面鏈接之間的差別就在於HTTP的GET方法傳遞的參數不同。每次頁面跳轉後插入一個等待時間,保證頁面加載完成就能獲取頁面找出圖片鏈接。

網頁中的圖片鏈接很有規律,不需要解析整個網頁,只需要用正則表達式查找就能定位鏈接。圖片下載相對簡單,urllib就已經包含了這個功能。

直接下載的圖片數據量大,圖片格式也比較混亂,有的圖片格式甚至和後綴名不一致。建立數據庫時用Python的PIL庫將圖片轉換成統一的個式並縮小尺寸。

圖像檢索

1、使用平臺及語言

使用平臺:VS2015+MFC

語言:C語言

VS: Microsoft Visual Studio(簡稱VS)是美國微軟公司的開發工具包系列產品。VS是一個基本完整的開發工具集,它包括了整個軟件生命週期中所需要的大部分工具,如UML工具、代碼管控工具、集成開發環境(IDE)等等。所寫的目標代碼適用於微軟支持的所有平臺,包括Microsoft
Windows、Windows Mobile、Windows
CE、.NET Framework、.NET Compact
Framework和Microsoft Silverlight 及Windows Phone。

MFC: 微軟基礎類庫(英語:Microsoft Foundation Classes,簡稱MFC)是微軟公司提供的一個類庫(class libraries),以C++類的形式封裝了Windows API,並且包含一個應用程序框架,以減少應用程序開發人員的工作量。其中包含大量Windows句柄封裝類和很多Windows的內建控件和組件的封裝類。

界面如下:
在這裏插入圖片描述
在這裏插入圖片描述

2、圖像檢索操作流程

2.1點擊 選擇檢索圖像按鈕

在這裏插入圖片描述

點擊“選擇帶檢索圖像”按鈕,即可選擇圖片文件進行打開並在“待檢索圖像”窗口顯示出來。

目前只支持.bmp格式的圖片。(你可以選擇用opencv萬事大吉)

2.2選擇數據庫路徑

在這裏插入圖片描述

點擊“選擇數據庫路徑”按鈕,進行數據庫路徑選擇。

選擇後會彈窗確認選擇的目錄以及此目錄下(包含子文件夾)檢索到多少張圖片。

目前支持100張以內的檢索。

2.3點擊直方圖檢索

在這裏插入圖片描述

點擊直方圖檢索按鈕,開始對數據庫內的圖片進行逐張計算,最後選取相似度最高的九張圖片依次展現在檢索結果欄。

2.4人臉檢測與識別(待添加)

3.此應用程序用途

這次圖像檢索用的是彩色直方圖進行檢索,經過探索,最終發現這個應用程序有以下兩個用途:

第一, 找相似風格圖片。譬如:
在這裏插入圖片描述
在這裏插入圖片描述

第二, 爲人像找風格對應的風景照,譬如

在這裏插入圖片描述
美好光明,磅礴大氣


在這裏插入圖片描述

魔幻奇妙,捉摸不定


在這裏插入圖片描述
憂鬱神祕,能量洶湧


這個還是不錯的,可能會有市場,畢竟大家都喜歡從宇宙中找一找屬於自己特徵的那一點東西來滿足自己。

上週作業遺留問題:彩色直方圖檢索

上次實驗對於彩色直方圖,我採用的是對RGB三個通道分別計算直方圖。直方圖均衡化的效果是這樣的
在這裏插入圖片描述

猛一看是挺好看,仔細想想就覺得不太對勁,看灰度圖均衡化後變得更清晰了,挺好,但是看這彩色的,基調都變了,不太正常。上網搜了搜,明白了具體原因——

Histogram equalization is a non-linear
process. Channel splitting and equalizing each channel separately is not the
proper way for equalization of contrast. Equalization involves Intensity values
of the image not the color components. So for a simple RGB color image, HE should not be applied individually on each channel.
Rather, it should be applied such that intensity values are equalized without
disturbing the color balance of the image. So, the first step is to convert the
color space of the image from RGB into one of the color space which separates intensity values from color components. Some of these are:
HSV/HLS YUV YCbCr
Convert the image from RGB to one of the above mentioned color spaces. YCbCr is preferred as it is designed for digital images.Perform HE of the intensity plane Y. Convert the image back to RGB.

顏色直方圖是在許多圖像檢索系統中被廣泛採用的顏色特徵。它所描述的是不同色彩在整幅圖像中所佔的比例,而並不關心每種色彩所處的空間位置,即無法描述圖像中的對象或物體。顏色直方圖特別適於描述那些難以進行自動分割的圖像。

當然,顏色直方圖可以是基於不同的顏色空間和座標系。最常用的顏色空間是RGB顏色空間,原因在於大部分的數字圖像都是用這種顏色空間表達的。然而,RGB空間結構並不符合人們對顏色相似性的主觀判斷。因此,有人提出了基於HSV空間、Luv空間和Lab空間的顏色直方圖,因爲它們更接近於人們對顏色的主觀認識。其中HSV空間是直方圖最常用的顏色空間。它的三個分量分別代表色彩(Hue)、飽和度(Saturation)和值(Value)。

於是這次的圖像檢索用了HSV彩色直方圖進行檢索。

RGB轉換爲HSV格式後,進行計算直方圖,然後通過計算直方圖的距離來判斷相似度,最後對相似度進行排序。

遇到的問題及收穫

這次的作業,大部分時間還是花在了MFC上,對圖像檢索沒有加入其他算法,有點捨本逐末了。

期間遇到很多問題都是MFC的問題,尤其是CString這塊,又在unicode環境下,確實費了不少功夫。

課上聽老師講的一個公司對人圖像捕獲後進行爬蟲感覺很酷,其實最初是想做一個人臉檢索的,所以界面加了人臉檢測人臉識別,後來發現確實有點難度,時間也不太夠用。本來是打算調用OpenCV進行面部識別,結果遇到了下面這個錯誤

在這裏插入圖片描述

我安裝的是3.4.1版本,只支持64位,而這次MFC是32位,改爲64位又會出問題,所以到今天人臉識別也還是擱淺了。

這一次實驗,最開始聽到這個內容的時候感覺難以置信,覺得不可能完成,真的去做了做發現其實也不是特別困難(至少搭建雛形還是可以的),難在如何用更好更恰當的圖像檢索方式進行圖像檢索吧。

最開始用自己寫的這個應用程序檢索人臉,效果不是特別的好,心裏特別着急,心想這圖片那麼大的信息量怎麼就用不上呢。以後還是好好學學圖像處理,不辜負圖片的信息量吧。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章