基于Matlab实现以图识图的研究

2016-06-30 21:31刘瑞霖
科技视界 2016年15期

刘瑞霖

【摘 要】以前我们想根据一张图片搜索更多类似图片时,往往是输入图片的文件名、索引或关键词来搜索,其结果往往不尽人意。本文作者拟研究运用图像识别技术来实现以图识图。图像识别是基于图片内容,应用计算机视觉技术,让计算机根据“看到”的有关图片而进行比对、匹配,搜索结果的相似度将有所提高。以图识图的实现方法有很多,本文的研究方法是基于Matlab平台,通过对目标图片和图库图片进行颜色、纹理等特征分析,通过指定算法得到特征矩阵,从而匹配相似度较高的图片。从研究结果看,本文所设计的研究步骤和算法,能较好地实现以图识图的功能。

【关键词】Matlab;以图识图;颜色特征;纹理特征;颜色直方图;特征矩阵

1 研究的背景和目的

随着互联网的发展,人们之间的交流已不再局限于文字,图片也成为了信息传递的一种重要媒介。然而,虽然图片比文字更为生动、直观,容易理解,但面对一幅陌生的图片,想通过搜索而进一步了解它却远没有文字搜索容易。在这种情况下,能帮助用户找到近似的图片的以图识图技术,便尤为重要。美国的谷歌识图、中国的百度识图等应用相继推出,让这方面的研究吸引了越来越多的关注。

以前的搜索引擎一般是根据图片的文件名、索引、关键词等来进行匹配,但是结果往往会不尽人意。以图识图是应用了计算机视觉(computer vision)技术,让计算机“看到”有关图片而进行自动比对、匹配,搜索结果的相似度将有所提高。

本文拟通过Matlab平台,研究以图识图的实现方法。

2 研究的实施方法

2.1 研究平台的介绍

MATLAB是指矩阵实验室(MatrixLaboratory).是一个高级的矩阵/阵列语言,同时也是个是一个包含大量计算算法的集合。Matlab拥有600多个工程中要用到的数学运算函数,可以方便的实现用户所需的各种计算功能。它还提供了专业水平的符号计算、文字处理、可视化建模仿真和实时控制等功能.由于Matlab是为矩阵计算而研发的,内含多种矩阵运算方法,而每张图片又可以看作多个像素点组合而成的矩阵,因此它在图片的特征提取和计算方面显得尤为方便,适合以图识图软件的编写。

2.2 以图识图的原理

以图识图简单来讲就是根据客户的目标图片在图片库里搜寻相似图片。基本的原理就是指根据图像内容特征以及特征组合,给每张图片分配一个像指纹一样的矩阵,矩阵越接近,图片就越相似。

本文是通过提取图像的内容特征,如颜色、纹理、形状等来研究,没有包括更深一层的语义。提取图像的内容特征就是对图片特征矩阵(颜色矩阵、纹理矩阵等)的提取,将人类所能观察到的图片数据化。数据化后,将图片库中原有的特征矩阵相比对,通常是求两矩阵之差。因此,数据化后得出的检索结果,就是图片库中,与目标图片的某几种特征差别最小的,比如说颜色最相近,纹理最近似的。

1)颜色特征

图像其实是由许许多多被称为像素点的小点构成的,每个像素点有不同的值,这是组成图像的基本单元要素。

颜色特征就是根据不同像素点的不同值的特征而提取的一种全局特征。一个像素点代表一种颜色,将所有像素点进行提取、统计,就可以得到各种颜色在图像中像素点总个数,然通过颜色直方图表达出来。

2)纹理特征

“纹理是由一个具有一定的不变性的视觉基元,在给定区域内的不同位置上,以不同的形变和不同的方向重复出现的一种图纹”,它也是图像的重要“身份”特征之一。使用纹理特征可以较好地区分出相似颜色区域,对于物体和背景不易分割的图像比较适用。

能表达各种颜色的在图像中的分布情况,导致搜索准确率大大降低。

3)颜色直方图

颜色直方图是颜色在图像中的空间分布情况,它是基于不同的颜色空间和坐标系。常用的颜色空间有RGB、HSV、Luv和Lab空间,其中HSV是最常用的,对应人眼视觉特性,从色彩(Hue)、饱和度(Saturation)和值(Value)三个方面来表达图像的特征。

2.3 研究实施步骤

基于图像内容实现检索的基本思路是:

1)分析目标图片的基本内容,通过自动或半自动的方法提取目标图像的特征,包括颜色、纹理、形状以及空间关系等特征。

2)将得到的图像特征作为其“指纹身份”,根据指定的算法计算和评价目标图像和图库图像各种特征之间的相似程度。

3)根据比对结果,将最相似的一组图片反馈给使用者。

(1)图像解码

通过扫描、采样和量化,提取图片的颜色空间。在Matlab中可以直接用一个子程序A=imread(‘图片路径/图片名.图片格式‘)实现。

(2)图像预处理

对图像进行缩放、灰度、反转、直方图等格式转换,以供程序提取特征使用。

(3)图片特征提取

通过程序提取图像颜色、纹理和HSV颜色空间等描述全局特征,使用fast、Harris描述图像的局部特征。

(4)得出特征矩阵

通过Matlab得到MAT格式的矩阵集合,每个矩阵代表一个图片。

(5)特征相似度匹配及索引

用“距离”的概念来度量图片的相似度。有闵式、余弦和海明距离来规定这些图片的相似程度,计算两张图片的“距离”的最简单的算法就是:距离=sqrt(sum((X-Y)^2)), X与Y代表两个矩阵中相对应的元素。再按照一定的检索算法,和图片库的特征进行比对,得到匹配程度的排序。

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算法规定,如果点A的周围(在半径为3个像素点的圆周内),有足够多的点(12个点),与点A的灰度之差大于设定的一个阈值,那么程序就判定点A为角点。在以图识图中,角点可作为局部特征来进行检索。但一张图片中有无数像素点,如果将每个点进行计算,工作量将会巨大。因此通过算法筛选出可能是角点的像素点是一种有效的方法。以下是简易判断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;