基于C#和SQL Server的图像特征库设计与实现①

2019-02-15 03:56宋卫华项芳莉
关键词:字段特征提取检索

宋卫华, 项芳莉

(黄山学院信息工程学院,安徽 黄山 245041)

0 引 言

基于内容的图像检索技术主要从底层颜色、形状、拓扑结构、纹理等视觉特征和高层语义特征方方面,同时融入人工智能中的深度学习技术,对研究图像进行分析、识别与检索[1],其在医疗辅助诊断、农作物病虫害识别、人脸识别、设备检测与维修、旅游推荐等领域有着广泛的应用。基于内容的推荐系统研究近年来才有了突破性进展[2],基于内容的旅游推荐指根据旅游商品内容信息(如商品图像自身属性、商品详情等)进行推荐,通过这些特征数据来发现商品的关键描述特性,从而将用户浏览历史特征匹配相似度较高的商品推荐给相关用户[3]。图像匹配的模块主要包含数据库建立和数据库查询两大模块,而特征库的建立主要是对图像源中大量数据的特征提取问题[4]。为此,文中将以图像底层特征中的颜色特征为例,使用C#编程语言和SQL Server数据库工具,完成图像特征库的设计与实现,从而为后续进行基于图像特征匹配的旅游推荐研究做好铺垫。

1 图像颜色特征算法分析

颜色特征作为一种广泛存在的视觉特征,在图像检索和识别领域应用较多。此外,与其他视觉特性相比,其对图像本身的尺寸、方向和视角的依赖性较小,因此具有较高的鲁棒性。颜色相关图是图像颜色众多表达中,描述颜色分布的一种方式,其不仅能刻画某一种颜色比例,同时还能反映不同颜色对之间的存在的空间相关性,同时,相比于颜色直方图和颜色聚合向量,在图像检索匹配和识别方面具有更高的查准率和查全率,为此被认为是图像颜色特征的一种有效表达[5]。

对于一幅图像I,颜色相关图是从联合概率分布情况出发,描述的是距离为d像素的一对像素Pi和Pj,并分别具有像素值为ci和cj的出现概率Pr,其公式可定义如下:

(1)

其中Ici表示颜色为ci的像素的集合。这里距离d采用棋盘距离,即:

d8(Pi,P)=max(|xi-x|,|yi-y|)文中d取1,这里i∈[0,7],其位置如下图1所示:

P0P1P2P3PP4P5P6P7

图1 距离d=1时的棋盘距离

由于统计所得的像素值共有256个灰度级,因此,如果考虑所有颜色之间的相关性,则颜色相关图的计算量将相当大(空间复杂度为256×256×d),因此采用自相关图,在此仅考虑具有相同颜色值的像素间的空间关系,从而可将空间复杂度降低至(256×d),即对于上式中ci=cj,因在此自相关图定义如下:

(2)

然后统计上述距离下的颜色值同时为ci的颜色对的概率,公式如下:

(3)

2 图像特征数据库结构实现

图像特征库的建立主要是通过对所给图像数据的遍历,提取其颜色相关图特征,然后将特征信息存储到数据库中,以备用于图像的检索、识别等。其主要步骤如下:

2.1 在SQL Server中创建数据库

首先在SQL Server2012中建立一个名为ImageFeature的数据库,用于存储图像特征信息,实现如下:

CREATE DATABASE ImageFeature ON PRIMARY

( NAME = ' ImageFeature _Data', FILENAME = 'D: ImageFeature _Data.mdf' , SIZE = 4096KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB ) /*数据库主文件*/

2.2 结合C#语言在SQL Server中创建特征数据库的表结构

数据库作为存放数据的一个大仓库,其包含多个表,而这些表存放不同的信息,遵循的是一事一地的原则。在前面论述中可知,基于底层的颜色特征信息是一个256维的向量,这就意味着在ImageFeature数据库存放颜色特征信息的表至少要包含256个字段,然而仅仅用一般的字段命名方法并不可取,故在此为特征字段命名为corr0…corr255,其分别代表像素值为0…255所对应的颜色自相关图特征,然而运用自主式SQL语言建立不大方便,为此结合C#语言中的ADO.NET技术[6]和嵌入式SQL,一次完成表中256个字段的建立,具体实现步骤如下:

(1)新建查询或使用SQL Server Management Studio建立一个颜色特征表

代码如下:

CREATE TABLE corrfeature (

id identity(1,1) not null, /*图像id,标识种子,值按1递增*/

filepath varchar(200) not null /*图像路径:用于存放图像绝对路径*/)

(2)利用ADO.NET技术连接数据库结合嵌入式SQL,为颜色特征表一次添加256个特征字段

引入命名命名空间: using System.Data.SqlClient ;核心代码如下:

string connString =@"server= USER-swhSQLEXPRESS.;database=ImageFeature;integrated security=true";

SqlConnection nwindConn= new SqlConnection(connString);

SqlCommand catCMD = nwindConn.CreateCommand();

nwindConn.Open();/*创建数据库连接*/

try

{ /*嵌入SQL语句,一次建立256个特征字段*/

for (int i = 0; i < 256; i++)

{/*字段循环命名*/

string s = "alter table corrfeature add corr" + i.ToString() + " float null";

string temp= s.ToString();

catCMD.CommandText = temp;

catCMD.ExecuteNonQuery();

}

MessageBox.Show("表建立完成!");

}

则程序编译通过后,建立的颜色特征表结构即包含id,filepath,corr0-corr255共258个字段。

3 图像特征数据库数据获取

颜色特征表结构建立完成后,仅仅是完成了表静态结构的建立,至此,存放数据的容器已经设计完毕。如何将图像源中图像的底层颜色特征信息数据,存放到此表中将是接下来要准备的工作,步骤如下:

3.1 C#中建立特征提取类

首先在C#中建立一个提取颜色相关图特征的类imagecorr,以备调用和资源共享,核心代码如下:

public class imagecorr

{static public float[] Correlogram(Bitmap bmp) /*实现颜色自相关图特征提取的函数*/

{ Color color;

int wid,hei;

wid=bmp.Width;

hei=bmp.Height;

int[,] gray = new int[wid, hei];

float[] bin = new float[256];

float[,] corr = new float [256, 1];

float[]mycorrl=new float[256]; /*保存颜色自相关图特征向量*/

for(int i=0;i

{for(int j=0;j

{color = bmp.GetPixel(i, j);

int value = (int)(0.299 * color.R + 0.587 * color.G + 0.114 * color.B);

gray[i, j] = value ;

}

}

/*计算图像自相关图特征*/

for(int i=0;i

{for(int j=0;j

{ int q = gray[i, j];

for(int k=1;k<2;k++) /*距离d=1时的棋盘距离*/

{for(int l=(-1)*k;l

{ try

{ if (gray[i + l, j - k] == q)

{ corr[q,k-1]++;

mycorrl[q]++;

}

}

try

{ if (gray[i + k, j + l] == q)

{

corr[q,k-1]++;

mycorrl[q]++;

}

}

try

{ if (gray[i - l, j + k] == q)

{ corr[q,k-1]++;

mycorrl[q]++;

}

}

try

{ if (gray[i - k, j - l] == q)

{

corr[q,k-1]++;

mycorrl[q]++;

}

}

}

}

}

}

for(int h=0;h<256;h++)

{ if (bin[h]!=0)

{ for(int k=0;k<1;k++)

{ corr[h,k]=corr[h,k]/(8*(k+1)*bin[h]);

mycorrl[h]=corr[h,k];

}

}

}

return mycorrl;

}

}

3.2 C#结合嵌入式SQL批量提取图像特征入库

运用C#连接到SQL Server中的数据库,再结合嵌入式SQL对图像源(一般存放在某个路径下)中的图像进行递归遍历[7],然后调用imagecorr类中Correlogram(Bitmap bmp)函数,完成批量图像的特征提取,并将特征数据存放到数据库中的corrfeature表中,核心代码如下:

private void buttonFeature_Click(object sender, EventArgs e)/*按钮单击事件,选择图像源*/

{ FolderBrowserDialog folderBrowserDialog1 = new FolderBrowserDialog();

folderBrowserDialog1.Description = "图像颜色特征入库";

/*选择图像源所在目录*/

if (folderBrowserDialog1.ShowDialog() == DialogResult.OK)

{ Listimagepath(new DirectoryInfo(folderBrowserDialog1.SelectedPath));}

MessageBox.Show("特征遍历提取完成!");

/*关闭数据库连接,同表结构的建立,此处省略*/

}

/*函数Listimagepath递归调用,遍历路径下所有图像*/

public void Listimagepath(FileSystemInfo myfileinfo)

{ if (!myfileinfo.Exists) return;

DirectoryInfo dirinfomat = myfileinfo as DirectoryInfo;

if (dirinfomat == null) return;

FileSystemInfo[] files = dirinfomat.GetFileSystemInfos();

for (int i = 0; i <= files.GetUpperBound(0); i++)/*遍历目录下所有图像文件、子目录 */

{FileInfo file = files[i] as FileInfo;

if (file != null) // 是文件

{if (file.Extension == ".bmp")

{string sqlstr, filename;

filename = file.DirectoryName;

StringBuilder s = new StringBuilder("insert into corrfeature ( filepath");

Bitmap b = new Bitmap(file.FullName);

/*调用imagecorr类中的函数Correlogram,获取颜色自相关图特征*/

float[] mycorr = imagecorr.Correlogram(b);

for (int j = 0; j < mycorr .Length ; j++)

{ s.Append(",corr" + j); }

s.Append(" ) values ( '" + file.FullName + "'" );

for (int j = 0; j < mycorr .Length ; j++)

{s.Append("," + mycorr[j]);}

s.Append(")");

sqlstr = s.ToString();

try {nwindConn.Open();

catCMD.CommandText = sqlstr;

int count= catCMD.ExecuteNonQuery();

}

catch { /*捕获异常,同表结构的建立*/}

}

}

else //是目录

{ Listimagepath(files[i]); /*对子目录进行递归调用*/ }

}

}

4 结 语

文中在分析图像底层颜色相关图算法的基础上,运用C#语言和SQL Server2012完成了图像颜色自相关图特征数据的获取,进而实现了图像颜色特征数据库的快速构建,对研究图像检索、识别、去噪、旅游推荐等方面具有一定的参考价值。

猜你喜欢
字段特征提取检索
图书馆中文图书编目外包数据质量控制分析
基于Gazebo仿真环境的ORB特征提取与比对的研究
基于Daubechies(dbN)的飞行器音频特征提取
Bagging RCSP脑电特征提取算法
专利检索中“语义”的表现
CNMARC304字段和314字段责任附注方式解析
基于MED和循环域解调的多故障特征提取
无正题名文献著录方法评述
关于CNMARC的3--字段改革的必要性与可行性研究
国际标准检索