基于C#和SQL Server的图像特征库设计与实现①
2019-02-15宋卫华项芳莉
宋卫华, 项芳莉
(黄山学院信息工程学院,安徽 黄山 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; } } 运用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]); /*对子目录进行递归调用*/ } } } 文中在分析图像底层颜色相关图算法的基础上,运用C#语言和SQL Server2012完成了图像颜色自相关图特征数据的获取,进而实现了图像颜色特征数据库的快速构建,对研究图像检索、识别、去噪、旅游推荐等方面具有一定的参考价值。3.2 C#结合嵌入式SQL批量提取图像特征入库
4 结 语