基于内容的图像搜索:通过示例查找图像
1. 图像搜索方式
在互联网搜索领域,谷歌以其强大的文本搜索功能闻名。用户只需在搜索框中输入简单的几个词,就能触发复杂的算法,得到成百上千条相关匹配结果,这些网页不仅包含搜索词,还在内容上反映了这些词的含义。文本搜索相对简单,通常是查找文本的精确匹配或相近变体,例如搜索“house”可能会匹配到“souses”和“homes”。
而图像搜索则要困难得多,主要有两种方式:
-
基于文本描述
:像谷歌图片搜索,用户输入描述性文字,如搜索“radio”,系统会返回相关图片。不过,这些图片是经过人工分类并添加文本标签的,搜索时匹配的是文本标签。这种方式并非自动自发,对于新图像,需要人工先进行分类。考虑到每天互联网上新增的海量图像,从长远来看,这并非成功的策略,而且对于个人电脑上的照片集也不太实用。
-
基于示例图像
:用户提供一张或多张示例图像,询问“能否展示更多类似的图像”。这意味着系统要能根据图像内容的特征找到相似图像,并确定“类似”的定义。例如在一张风景图中,用户可能搜索的是山脉、天空或停在电线杆旁的黑色汽车等,但图像本身往往难以明确这些信息,所以多张图像作为查询可能效果更好。
示例查询(QBE)或基于内容的图像检索(CBIR)
具体来说,会给系统一个标记为“目标”的图像,系统会计算目标图像与搜索集中其他所有图像的相似度,然后将最相似的图像作为可能的匹配结果呈现给用户。不过,即使是最佳匹配也不一定完美。
搜索图像的内容涉及使用计算机视觉技术和基本统计方法来描述图像。如果图像有很多共同的特征描述,或者接近共同特征,就可以认为它们相似。但哪种特征最适合图像匹配,取决于具体的图像。
2. 图像集合的维护
对于基于示例的查询(QBE)系统,一个实际问题是如何存储、标记和测量图像。一个有效的QBE系统需要具备扫描目录查找图像文件的能力,因为手动检查海量数据是不现实的。每次查询时,将目标图像指定后,如果每次都在整个计算机中搜索可能匹配的图像,效率会很低。因此,更好的方法是维护一个可搜索的图像集合,并将它们保存在固定的、已知的位置。
图像集合的存储
这里假设图像集合位于PC目录
C:\AIPCV\imagedata
下的1到1000个子目录中。这种文件组织方式是任意的,可以根据特定的图像集或应用进行更改。每个子目录包含一组相关的图像。例如,可以从互联网下载图像数据集,这里以ALOI(阿姆斯特丹对象图像库)数据集为例,该数据集可从
http://staff.science.uva.nl/~aloi/
免费下载。在这个数据集中,每个子目录包含同一对象以已知角度旋转的图像,背景相对统一为黑色,这对于测试算法很有帮助,因为没有背景干扰。
构建主数据文件
下载并安装图像集合后,建议构建一个主数据文件,其中包含集合中所有文件的路径名以及与这些文件相关的数据,如用于匹配的特征值。这样可以确保在初始搜索时不涉及图像文件本身。主文件是文本文件,可以根据需要手动编辑,也可以自动处理整个集合。
扫描目录的程序
为了实现上述功能,需要一个简单的程序来完成以下两个任务:
1. 检查目录和子目录中的所有文件,并构建一个主文本文件。
2. 构建一个主特征文件,包含所有文件的路径名和相关特征。
以下是一个简单的程序示例,用于打印
AIPCV
目录中的所有图像文件:
dir = opendir ("c:\\AIPCV\\");
if (dir != NULL) {
/* print all the files and directories within directory */
while ((ent = readdir (dir)) != NULL)
{
if (ent->d_name[strlen(ent->d_name)-4] == '.')
{
str = (char *)(&ent->d_name[strlen(ent->d_name)-3]);
lowerCase (str);
printf ("File type is %d ", ent->d_type);
if ( strcmp(str, "jpg")==0 )
printf ("File '%s' is JPEG.\n", ent->d_name);
else if ( strcmp(str, "png")==0 )
printf ("File '%s' is PNG.\n", ent->d_name);
else if ( strcmp(str, "bmp")==0 )
printf ("File '%s' is BMP.\n", ent->d_name);
else if ( strcmp(str, "ppm")==0 )
printf ("File '%s' is PPM.\n", ent->d_name);
else if ( strcmp(str, "pgm")==0 )
printf ("File '%s' is PGM.\n", ent->d_name);
...
}
}
closedir (dir);
} else
{
/* could not open directory */
perror ("");
return 1;
}
这个代码虽然不处理图像,但对于基于内容的搜索程序至关重要。另一种方法是手动构建图像文件列表,但在现代大容量硬盘上,这种方法不切实际。
操作步骤总结
-
下载数据集
:从
http://staff.science.uva.nl/~aloi/下载ALOI数据集到指定目录C:\AIPCV\imagedata。 - 构建主数据文件 :编写程序扫描目录,将文件路径名和相关特征信息存储在主数据文件中。
- 使用扫描程序 :运行上述示例代码,打印指定目录下的图像文件信息。
流程图
graph TD
A[开始] --> B[下载ALOI数据集]
B --> C[构建主数据文件]
C --> D[使用扫描程序]
D --> E[结束]
3. 基于示例查询的图像特征
要在图像集合中找到与示例图像相似的图像,需要考虑图像中对象的组合方式,通常是根据对象的性质来确定图像的相似度。然而,光照、方向、比例和噪声等不可控因素也会严重影响图像中同一组对象的呈现效果。目前常用的方法是从目标图像中提取特征,并将这些特征值与搜索集中图像提取的特征值进行比较。如果搜索集提前处理并提取了所有特征并制成表格,那么查询时只需检查目标图像,这种方法对于个人数据集和个人图像是可行的,但不适用于网络图像搜索。
颜色特征的应用
由于现在大多数图像是彩色图像,因此很多文献建议在基于示例的查询和基于内容的搜索中使用颜色特征。现代数码相机普遍拍摄彩色图像,这也是过去十年图像数据爆炸式增长的主要原因。如今,黑白照片更多是作为艺术表达,而且许多存档的黑白图像多年来已进行了人工分类。所以,研究基于示例的查询时,考虑使用颜色来匹配图像是有意义的。
彩色图像特征的具体方法
3.1 颜色直方图
可以使用量化方案减少图像中的颜色数量,然后统计每种颜色出现的次数(即该颜色的像素数量),这是一种简单的图像特征描述方式,可以用于比较不同图像。颜色减少可以帮助排除明显不匹配的图像,例如目标图像中没有绿色,那么包含绿色的图像就不太可能是匹配项。可以为所有图像创建红、绿、蓝、黄等各种颜色的直方图,根据图像中各种颜色的含量来匹配图像。在这种方案下,图像与自身的匹配是完美的,但与其他图像的匹配程度则取决于颜色内容。虽然可能存在两张图像在颜色直方图上完全匹配的情况,但这种情况比较罕见。
对于没有颜色的图像,可以将直方图方法应用于灰度级别,统计每个灰度值的像素数量。在大多数情况下,彩色图像可以转换为灰度图像而不损失区域或形状信息,就像过去的黑白电影和电视,人们依然能清晰分辨场景和物体。
3.2 平均颜色
计算图像中所有像素的R、G、B值的平均值是比较简单的。虽然这可能不是衡量两张图像相似度的有力指标,只是一个单一的数值,比较粗略,但它可以作为一个否定特征,帮助排除一些明显不相似的图像,而且计算简单。图像的整体平均颜色值可以作为一个特征,称为平均特征。
3.3 颜色四叉树
四叉树是一种二维树状数据结构。从第一层开始,代表整个图像,树有一个节点;下一层有四个节点,分别对应图像的四个等大小象限;再下一层将每个象限又分成四个部分,以此类推,直到最后一层,每个节点代表一个像素。
可以通过多种方式使用四叉树来比较图像的相似度。例如,检查被比较图像的四叉树,看在颜色或其他特征方面,它们在树的多少层深度上能够达成一致。在图像的某些部分,四叉树的匹配可能更好,这可能表明相似度具有空间属性。不过,更简单的方法是构建特定层级上看到的颜色向量,并将其作为特征。第0层有一个颜色,即整个图像的平均颜色;第1层有四个子图像,每个子图像有一个平均颜色,形成一个包含四个颜色(或12个分量)的向量,称为四叉特征;第2层有16个颜色(或48个分量),可能会得到更好的匹配效果,称为十六叉特征。但层数过多会使匹配过于具体,达到一定程度后收益会递减。
四叉树的结构体定义如下:
struct quadtree
{
struct quadtree *next[4];
int uli, ulj, lri, lrj;
float r, g, b;
};
3.4 色调和强度直方图
使用四叉树作为颜色特征可以将颜色值与空间坐标以一种大致的方式联系起来,而直方图则纯粹是对图像颜色内容的度量,并且可以更精确。直方图中的每个区间代表一个颜色范围,区间大小可以根据需要调整。RGB值对于直方图处理不太方便,因为它们是三维向量,而标量更合适,所以色调或强度(灰度级别)可能更适用。
可以使用OpenCV的
cvCvtColor
函数将RGB图像转换为HSV图像,色调是HSV图像中像素值的第一个分量,取值范围是0到179(其完整范围是0 - 360度的一半)。构建色调直方图H的步骤如下:
1. 将图像转换为HSV格式。
2. 初始化直方图为零。
3. 遍历所有像素,找到每个像素的色调分量k,并增加相应区间的值:
H[k] += 1
。
4. 对直方图进行归一化处理,即每个区间的值除以所有区间值的总和S(通常等于像素数量)。
以下代码用于计算色调直方图,并忽略灰度像素(几乎没有色调):
cvCvtColor( img, hsv, CV_BGR2HSV );
for (i=0; i<180; i++) hhisto[i] = 0;
for (i=0; i<hsv->height; i++)
for (j=0; j<hsv->width; j++)
{
s = cvGet2D (hsv, i, j);
if (isGrey(s)) continue; // no hue
k = (int)s.val[0];
hhisto[k] += 1; n++;
}
for (i=0; i<180; i++) hhisto[i] /= n;
3.5 直方图比较
两个直方图H1和H2,如果对于所有合法的i值,都有
H1[i] = H2[i]
,则它们相等。如果不相等,需要衡量它们的接近程度,更重要的是,要找出哪个直方图与目标直方图H3最相似。可以将直方图视为N维数组,像计算向量的范数一样计算两个直方图之间的欧几里得距离,这也是很多软件计算直方图相似度的方法。以下是实现这种方法的典型代码:
for (i=0; i<N; i++) sum += (H1[i]-H2[i])*(H1[i]-H2[i]);
d = sqrt(sum);
操作步骤总结
-
颜色直方图计算
:
- 使用量化方案减少图像颜色数量。
- 统计每种颜色的像素数量。
- 为图像创建各种颜色的直方图。
- 平均颜色计算 :计算图像所有像素的R、G、B值的平均值。
- 颜色四叉树构建 :按照四叉树的结构,从整个图像开始,逐层分割并记录每个节点的颜色信息。
-
色调直方图计算
:
-
使用
cvCvtColor函数将RGB图像转换为HSV图像。 - 初始化直方图为零。
- 遍历像素,增加相应色调区间的值。
- 对直方图进行归一化处理。
-
使用
- 直方图比较 :使用上述代码计算两个直方图之间的欧几里得距离。
表格总结
| 特征方法 | 操作步骤 |
|---|---|
| 颜色直方图 | 量化颜色、统计像素、创建直方图 |
| 平均颜色 | 计算R、G、B平均值 |
| 颜色四叉树 | 逐层分割图像、记录颜色信息 |
| 色调直方图 | 转换图像格式、初始化、遍历像素、归一化 |
| 直方图比较 | 计算欧几里得距离 |
流程图
graph TD
A[开始] --> B[选择特征方法]
B --> C{颜色直方图}
B --> D{平均颜色}
B --> E{颜色四叉树}
B --> F{色调直方图}
B --> G{直方图比较}
C --> C1[量化颜色]
C --> C2[统计像素]
C --> C3[创建直方图]
D --> D1[计算R、G、B平均值]
E --> E1[逐层分割图像]
E --> E2[记录颜色信息]
F --> F1[转换图像格式]
F --> F2[初始化直方图]
F --> F3[遍历像素]
F --> F4[归一化处理]
G --> G1[计算欧几里得距离]
C1 --> C4[结束颜色直方图操作]
D1 --> D2[结束平均颜色操作]
E2 --> E3[结束颜色四叉树操作]
F4 --> F5[结束色调直方图操作]
G1 --> G2[结束直方图比较操作]
综上所述,基于内容的图像搜索是一个复杂但有前景的领域,通过合理选择和应用图像特征,可以提高搜索的准确性和效率。在实际应用中,需要根据具体的图像特点和需求,灵活运用各种方法。
4. 特征方法的综合应用与优化
4.1 特征组合策略
单一的图像特征可能无法全面准确地描述图像的相似度,因此可以考虑将多种特征组合使用。例如,将颜色直方图和色调直方图结合,既能从整体颜色分布上进行匹配,又能从色调的角度进一步细化匹配结果。
具体操作步骤如下:
1. 分别计算目标图像和搜索集中图像的颜色直方图和色调直方图。
2. 对于颜色直方图,按照之前介绍的方法计算颜色含量的匹配度。
3. 对于色调直方图,同样计算其与目标图像色调直方图的相似度。
4. 为两种特征分配不同的权重,例如颜色直方图权重为 0.6,色调直方图权重为 0.4。
5. 综合两种特征的相似度得分,得到最终的相似度评估结果。
4.2 特征优化
在实际应用中,还可以对特征进行优化以提高匹配的准确性。例如,在计算颜色直方图时,可以采用更精细的量化方案,减少颜色的近似度误差。对于色调直方图,可以调整区间的划分方式,使直方图更能反映图像的色调特征。
以下是一个简单的优化示例,在计算色调直方图时,对区间进行动态调整:
// 动态调整区间数量
int numBins = 36;
cvCvtColor( img, hsv, CV_BGR2HSV );
for (i=0; i<numBins; i++) hhisto[i] = 0;
for (i=0; i<hsv->height; i++)
for (j=0; j<hsv->width; j++)
{
s = cvGet2D (hsv, i, j);
if (isGrey(s)) continue; // no hue
k = (int)(s.val[0] * numBins / 180);
hhisto[k] += 1; n++;
}
for (i=0; i<numBins; i++) hhisto[i] /= n;
4.3 操作步骤总结
-
特征组合
:
- 计算多种特征(如颜色直方图、色调直方图)。
- 分别计算各特征的相似度得分。
- 为各特征分配权重。
- 综合得分得到最终相似度评估。
-
特征优化
:
- 选择要优化的特征(如色调直方图)。
- 调整特征计算的参数(如区间数量)。
- 重新计算特征。
流程图
graph TD
A[开始] --> B[特征组合或优化选择]
B --> C{特征组合}
B --> D{特征优化}
C --> C1[计算多种特征]
C1 --> C2[计算各特征相似度得分]
C2 --> C3[分配特征权重]
C3 --> C4[综合得分]
D --> D1[选择优化特征]
D1 --> D2[调整计算参数]
D2 --> D3[重新计算特征]
C4 --> E[结束特征组合操作]
D3 --> F[结束特征优化操作]
5. 实际应用案例
5.1 个人照片管理
假设你有大量的个人照片存储在电脑中,想要快速找到与某张照片相似的其他照片。可以按照以下步骤进行操作:
1. 按照前面介绍的方法,维护一个可搜索的图像集合,将照片存储在固定目录下。
2. 提取照片的特征,如颜色直方图、平均颜色等,并构建主特征文件。
3. 选择一张照片作为目标图像,计算其特征值。
4. 将目标图像的特征值与主特征文件中的特征值进行比较,找出最相似的照片。
5.2 图像分类与标注
在一些图像分类和标注的应用中,也可以利用基于内容的图像搜索技术。例如,对于一批未分类的图像,可以选择一些具有代表性的图像作为示例,然后将其他图像与示例图像进行匹配,根据匹配结果对图像进行分类和标注。
具体操作流程如下:
1. 选择示例图像,并提取其特征。
2. 对未分类图像提取相同的特征。
3. 计算未分类图像与示例图像的相似度。
4. 根据相似度结果,将未分类图像分配到相应的类别中,并添加标注信息。
表格总结
| 应用场景 | 操作步骤 |
|---|---|
| 个人照片管理 | 维护图像集合、提取特征、选择目标图像、比较特征值 |
| 图像分类与标注 | 选择示例图像、提取特征、计算相似度、分类标注 |
流程图
graph TD
A[开始] --> B[应用场景选择]
B --> C{个人照片管理}
B --> D{图像分类与标注}
C --> C1[维护图像集合]
C1 --> C2[提取特征]
C2 --> C3[选择目标图像]
C3 --> C4[比较特征值]
D --> D1[选择示例图像]
D1 --> D2[提取特征]
D2 --> D3[计算相似度]
D3 --> D4[分类标注]
C4 --> E[结束个人照片管理操作]
D4 --> F[结束图像分类与标注操作]
6. 总结与展望
6.1 总结
基于内容的图像搜索通过利用计算机视觉技术和基本统计方法,为我们提供了一种有效的方式来查找与示例图像相似的图像。在图像搜索方式上,基于示例的查询(QBE)或基于内容的图像检索(CBIR)具有独特的优势,但也面临着光照、方向等不可控因素的挑战。通过维护图像集合、提取合适的图像特征(如颜色特征),并进行特征组合和优化,可以提高搜索的准确性和效率。在实际应用中,个人照片管理和图像分类标注等场景都可以受益于这种技术。
6.2 展望
随着计算机技术的不断发展,基于内容的图像搜索技术有望得到进一步的提升。未来可能会出现更先进的特征提取方法,能够更好地应对复杂的图像变化。同时,结合深度学习等人工智能技术,可能会使图像搜索的准确性和智能化程度达到新的高度。此外,在大规模图像数据的处理和搜索效率方面,也有很大的提升空间,例如利用分布式计算和云计算技术,实现更快速、更高效的图像搜索。
总之,基于内容的图像搜索是一个充满潜力的领域,值得我们持续关注和深入研究。通过不断探索和创新,相信这种技术将在更多的领域得到广泛应用,为我们的生活和工作带来更多的便利。
超级会员免费看
3210

被折叠的 条评论
为什么被折叠?



