劉瑞霖
【摘 要】以前我們想根據(jù)一張圖片搜索更多類似圖片時,往往是輸入圖片的文件名、索引或關(guān)鍵詞來搜索,其結(jié)果往往不盡人意。本文作者擬研究運用圖像識別技術(shù)來實現(xiàn)以圖識圖。圖像識別是基于圖片內(nèi)容,應(yīng)用計算機視覺技術(shù),讓計算機根據(jù)“看到”的有關(guān)圖片而進行比對、匹配,搜索結(jié)果的相似度將有所提高。以圖識圖的實現(xiàn)方法有很多,本文的研究方法是基于Matlab平臺,通過對目標(biāo)圖片和圖庫圖片進行顏色、紋理等特征分析,通過指定算法得到特征矩陣,從而匹配相似度較高的圖片。從研究結(jié)果看,本文所設(shè)計的研究步驟和算法,能較好地實現(xiàn)以圖識圖的功能。
【關(guān)鍵詞】Matlab;以圖識圖;顏色特征;紋理特征;顏色直方圖;特征矩陣
1 研究的背景和目的
隨著互聯(lián)網(wǎng)的發(fā)展,人們之間的交流已不再局限于文字,圖片也成為了信息傳遞的一種重要媒介。然而,雖然圖片比文字更為生動、直觀,容易理解,但面對一幅陌生的圖片,想通過搜索而進一步了解它卻遠(yuǎn)沒有文字搜索容易。在這種情況下,能幫助用戶找到近似的圖片的以圖識圖技術(shù),便尤為重要。美國的谷歌識圖、中國的百度識圖等應(yīng)用相繼推出,讓這方面的研究吸引了越來越多的關(guān)注。
以前的搜索引擎一般是根據(jù)圖片的文件名、索引、關(guān)鍵詞等來進行匹配,但是結(jié)果往往會不盡人意。以圖識圖是應(yīng)用了計算機視覺(computer vision)技術(shù),讓計算機“看到”有關(guān)圖片而進行自動比對、匹配,搜索結(jié)果的相似度將有所提高。
本文擬通過Matlab平臺,研究以圖識圖的實現(xiàn)方法。
2 研究的實施方法
2.1 研究平臺的介紹
MATLAB是指矩陣實驗室(MatrixLaboratory).是一個高級的矩陣/陣列語言,同時也是個是一個包含大量計算算法的集合。Matlab擁有600多個工程中要用到的數(shù)學(xué)運算函數(shù),可以方便的實現(xiàn)用戶所需的各種計算功能。它還提供了專業(yè)水平的符號計算、文字處理、可視化建模仿真和實時控制等功能.由于Matlab是為矩陣計算而研發(fā)的,內(nèi)含多種矩陣運算方法,而每張圖片又可以看作多個像素點組合而成的矩陣,因此它在圖片的特征提取和計算方面顯得尤為方便,適合以圖識圖軟件的編寫。
2.2 以圖識圖的原理
以圖識圖簡單來講就是根據(jù)客戶的目標(biāo)圖片在圖片庫里搜尋相似圖片?;镜脑砭褪侵父鶕?jù)圖像內(nèi)容特征以及特征組合,給每張圖片分配一個像指紋一樣的矩陣,矩陣越接近,圖片就越相似。
本文是通過提取圖像的內(nèi)容特征,如顏色、紋理、形狀等來研究,沒有包括更深一層的語義。提取圖像的內(nèi)容特征就是對圖片特征矩陣(顏色矩陣、紋理矩陣等)的提取,將人類所能觀察到的圖片數(shù)據(jù)化。數(shù)據(jù)化后,將圖片庫中原有的特征矩陣相比對,通常是求兩矩陣之差。因此,數(shù)據(jù)化后得出的檢索結(jié)果,就是圖片庫中,與目標(biāo)圖片的某幾種特征差別最小的,比如說顏色最相近,紋理最近似的。
1)顏色特征
圖像其實是由許許多多被稱為像素點的小點構(gòu)成的,每個像素點有不同的值,這是組成圖像的基本單元要素。
顏色特征就是根據(jù)不同像素點的不同值的特征而提取的一種全局特征。一個像素點代表一種顏色,將所有像素點進行提取、統(tǒng)計,就可以得到各種顏色在圖像中像素點總個數(shù),然通過顏色直方圖表達(dá)出來。
2)紋理特征
“紋理是由一個具有一定的不變性的視覺基元,在給定區(qū)域內(nèi)的不同位置上,以不同的形變和不同的方向重復(fù)出現(xiàn)的一種圖紋”,它也是圖像的重要“身份”特征之一。使用紋理特征可以較好地區(qū)分出相似顏色區(qū)域,對于物體和背景不易分割的圖像比較適用。
能表達(dá)各種顏色的在圖像中的分布情況,導(dǎo)致搜索準(zhǔn)確率大大降低。
3)顏色直方圖
顏色直方圖是顏色在圖像中的空間分布情況,它是基于不同的顏色空間和坐標(biāo)系。常用的顏色空間有RGB、HSV、Luv和Lab空間,其中HSV是最常用的,對應(yīng)人眼視覺特性,從色彩(Hue)、飽和度(Saturation)和值(Value)三個方面來表達(dá)圖像的特征。
2.3 研究實施步驟
基于圖像內(nèi)容實現(xiàn)檢索的基本思路是:
1)分析目標(biāo)圖片的基本內(nèi)容,通過自動或半自動的方法提取目標(biāo)圖像的特征,包括顏色、紋理、形狀以及空間關(guān)系等特征。
2)將得到的圖像特征作為其“指紋身份”,根據(jù)指定的算法計算和評價目標(biāo)圖像和圖庫圖像各種特征之間的相似程度。
3)根據(jù)比對結(jié)果,將最相似的一組圖片反饋給使用者。
(1)圖像解碼
通過掃描、采樣和量化,提取圖片的顏色空間。在Matlab中可以直接用一個子程序A=imread(‘圖片路徑/圖片名.圖片格式‘)實現(xiàn)。
(2)圖像預(yù)處理
對圖像進行縮放、灰度、反轉(zhuǎn)、直方圖等格式轉(zhuǎn)換,以供程序提取特征使用。
(3)圖片特征提取
通過程序提取圖像顏色、紋理和HSV顏色空間等描述全局特征,使用fast、Harris描述圖像的局部特征。
(4)得出特征矩陣
通過Matlab得到MAT格式的矩陣集合,每個矩陣代表一個圖片。
(5)特征相似度匹配及索引
用“距離”的概念來度量圖片的相似度。有閔式、余弦和海明距離來規(guī)定這些圖片的相似程度,計算兩張圖片的“距離”的最簡單的算法就是:距離=sqrt(sum((X-Y)^2)), X與Y代表兩個矩陣中相對應(yīng)的元素。再按照一定的檢索算法,和圖片庫的特征進行比對,得到匹配程度的排序。
2.4 具體算法
1)比較兩張圖片imgn1和imgn2的紋理特征:
imgn1=zeros(m1,n1);
for i=2:m1-1
for j=2:n1-2
pow1=0;
for q =j-1:j+1
for p=i-1:i+1
if img1(p,q) > img1(i,j)
if p~=i || q~=j
imgn1(i,j)=imgn1(i,j)+2^pow1;
pow1=pow1+1;
end
end
end
end
end
end
x1=imgn1(:);
X=1.0.*hist(x1,256)/(m1*n1);
img2=imread('D:\f.jpg');
img2=rgb2gray(img2);
[m2 n2]=size(img2);
imgn2=zeros(m2,n2);
for a=2:m2-1
for b=2:n2-1
pow2=0;
for t =b-1:b+1
for s=a-1:a+1
if img2(s,t) > img2(a,b)
if s~=a || t~=b
imgn2(a,b)=imgn2(a,b)+2^pow2;
pow2=pow2+1;
end
end
end
end
end
end
x2=imgn2(:);
Y=1.0.*hist(x2,256)/(m2*n2);
dist=sqrt(sum((X-Y).*(X-Y)));
dist=dist/3
2)比較兩張圖片I1和I2的HSV顏色特征:
I1=imread('D:\b.jpg');
I2=imread('D:\e.jpg');
[m1,n1,c1]=size(I1);
[m2,n2,c2]=size(I2);
I1=rgb2hsv(I1);
I2=rgb2hsv(I2);
H1=I1(:,:,1);
S1=I1(:,:,2);
V1=I1(:,:,3);
H2=I2(:,:,1);
S2=I2(:,:,2);
V2=I2(:,:,3);
XH=1.0.*imhist(H1)/(m1*n1);
YH=1.0.*imhist(H2)/(m2*n2);
distH =sum((XH-YH).*(XH-YH));
SUMH=sum(distH(:));
SUMH=SUMH/3;
XS=1.0.*imhist(S1)/(m1*n1);
YS=1.0.*imhist(S2)/(m2*n2);
distS=sum((XS-YS).*(XS-YS));
SUMS=sum(distS(:));
SUMS=SUMS/3;
XV=1.0.*imhist(V1)/(m1*n1);
YV=1.0.*imhist(V2)/(m2*n2);
distV=sum((XV-YV).*(XV-YV));
SUMV=sum(distV(:));
SUMV=SUMV/3;
sqrt(SUMH+SUMS+SUMV)
3)局部特征fast角點:
角點就是在圖片中灰度急劇變化的點。Fast算法規(guī)定,如果點A的周圍(在半徑為3個像素點的圓周內(nèi)),有足夠多的點(12個點),與點A的灰度之差大于設(shè)定的一個閾值,那么程序就判定點A為角點。在以圖識圖中,角點可作為局部特征來進行檢索。但一張圖片中有無數(shù)像素點,如果將每個點進行計算,工作量將會巨大。因此通過算法篩選出可能是角點的像素點是一種有效的方法。以下是簡易判斷fast角點的代碼:
第一層:
I=imread('D:\Day-2\Flower2.jpg');
im2uint8(rgb2gray(I));
h=fspecial('gaussian',5);
I=imfilter(I,h);
[m,n]=size(I);
t=20;
Corners=zeros(m,n);
for i=4:m-20
for j=20:n-20
Surpass=0;
if abs(I(i,j)-I(i-3,j))>t
Surpass=Surpass+1;
end
if abs(I(i,j)-I(i,j-3))>t
Surpass=Surpass+1;
end
if abs(I(i,j)-I(i+3,j))>t
Surpass=Surpass+1;
end
if abs(I(i,j)-I(i,j+3))>t
Surpass=Surpass+1;
end
if Surpass>=3
Corners(i,j)=1;