1.系统设计
颜色特征是在图像检索中应用最为广泛的视觉特征,主要原因在于颜色往往和图像中所包含的物体或场景十分相关。此外,颜色特征对图像本身的尺寸、方向、视角的依赖性较小,从而具有较高的检索性。利用颜色特征进行检索的方法主要基于直方图,如:直方图相交法,比例直方图法,距离法,参考颜色表法和聚类算法,累计直方图法,此外,还有HSI中心矩法。
RGB色彩模式是工业界的一种颜色标准,是通过对红(R)、绿(G)、蓝(B)三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色的,RGB即是代表红、绿、蓝三个通道的颜色,这个标准几乎包括了人类视力所能感知的所有颜色,是目前运用最广的颜色系统之一。
图1 RGB颜色空间
HSI模型是美国色彩学家孟塞尔(H.A.Munseu)于1915年提出的,它反映了人的视觉系统感知彩色的方式,以色调、饱和度和亮度三种基本特征量来感知颜色。
图2 HSI颜色空间
图像纹理特征纹理特征是一种不依赖于颜色或亮度的反映图像中同质现象的视觉特征。纹理特征包含了物体表面结构组织排列的重要信息以及它们与周围环境的联系。用户可通过提交包含有某种纹理的图像来查找含有相似纹理的其他图像。从人类的感知经验出发, 纹理特征主要有粗糙性、方向性和对比度。纹理分析方法,大致可分为两类:1)统计方法。用于分析像木纹、沙地、草坪等细致而不规则的物体,并根据关于像素间灰度的统计性质对纹理规定特征及特征与参数间的关系。2)结构方法。适于像布料的印刷图案或砖瓦等一类元素组成的纹理及其排列比较
规则的图案, 然后根据纹理基元及其排列规则来描述纹理的结构及特征、特征与参数间的关系。
(1)灰度共生矩阵
灰度共生矩阵是图像中相距为D的两个灰度像素同时出现的联合概率分布。通过计算灰度图像得到它的共生矩阵,然后透过计算这个共生矩阵得到矩阵的部分特征值,来分别代表图像的某些纹理特征。灰度共生矩阵能反映图像灰度关于方向、相邻间隔、变化幅度的综合信息,它是分析图像的局部模式和它们排列规则的基础。
是灰度共生矩阵元素值的平方和,也称之为能量,反映了图像灰度分布均匀程度和纹理粗细度。
度量矩阵的值是如何分布和图像中局部变化的多少,反应了图像的清晰度和纹理的沟纹深浅。纹理的沟纹越深,反差越大,效果清晰;反之,对比值小,则沟纹浅,效果模糊。
是图像包含信息量的随机性度量。当共生矩阵中所有值均相等或者像素值表现出最大的随机性时,熵最大;因此熵值表明了图像灰度分布的复杂程度,熵值越大,图像越复杂。
也称为同质性,用来度量图像的灰度级在行或列方向上的相似程度,因此值的大小反应了局部灰度相关性,值越大,相关性也越大。
pHash:感知哈希算法(Perceptual hash algorithm),它的作用是对每张图片生成一个"指纹"(fingerprint)字符串,然后比较不同图片的指纹。结果越接近,就说明图片越相似。
pHash的工作过程:
(1)缩小尺寸:pHash以小图片开始,但图片大于8*8,32*32是最好的。这样做的目的是简化了DCT的计算,而不是减小频率。
(2)简化色彩:将图片转化成灰度图像,进一步简化计算量。
(3)计算DCT:计算图片的DCT变换,得到32*32的DCT系数矩阵。
(4)缩小DCT:虽然DCT的结果是32*32大小的矩阵,但我们只要保留左上角的8*8的矩阵,这部分呈现了图片中的最低频率。
(5)计算平均值:如同均值哈希一样,计算DCT的均值。
(6)计算hash值:这是最主要的一步,根据8*8的DCT矩阵,设置0或1的64位的hash值,大于等于DCT均值的设为”1”,小于DCT均值的设为“0”。组合在一起,就构成了一个64位的整数,这就是这张图片的指纹。
结果并不能告诉我们真实性的低频率,只能粗略地告诉我们相对于平均值频率的相对比例。只要图片的整体结构保持不变,hash结果值就不变。能够避免伽马校正或颜色直方图被调整带来的影响。与均值哈希一样,pHash同样可以用汉明距离来进行比较。(只需要比较每一位对应的位置并算计不同的位的个数)
形状不变矩法
作为一组关于形状的统计值,矩不变量的表示形式有多种,如 Hu 矩,具有对图像的旋转、平移和尺度变化的不变性。基本思想就是用图像的 Hu 不变矩 u1~u7 和离心率 e 作为图像的形状特征索引,使用适当的相似性距离定义,计算出两幅图像的相似性距离。当距离足够小时,就认为两幅图像是相似的。
通过夹角的大小,来判断向量的相似程度。夹角越小,就代表越相似。余弦值越接近1,就表明夹角越接近0度,也就是两个向量越相似,这就叫"余弦相似性"。
(2)汉明距离
对两个字符串进行异或运算,并统计结果为1的个数,即两个等长字符串的二进制对应不相同的位个数,那么这个数就是汉明距离。距离越小图片越相似。
(1)系统开发工具:java
(2)数据库开发工具:MySQL
基于内容的图像检索技术是对输入的图像进行分析并分类统一建模,提取其颜色、形状、纹理、轮廓和空间位置等特征,建立特征索引, 存储于特征数据库中。检索时,用户提交查询的源图像,通过用户接口设置查询条件,可以采用一种或几种的特征组合来表示,然后在图像数据库中提取出查询到的所需关联图像,按照相似度从大到小的顺序,反馈给用户。用户可根据自己的满意程度,选择是否修改查询条件,继续查询,以达到满意的查询结果。
图1 基于内容的图像检索框架
图2 基于内容的图像检索系统逻辑模型
图像数据库包括两个部分:图像库和特征库。图像库是图像的集合,存储数字化的图像信息,具体在系统实现中,可以存放图像的路径和文件名称来表示;特征库存储图像中提取出的特征表达的相关信息,并为提取出的各个特征建立索引,且和图像间存在一一对应的关系。
(1)图像数据库(本系统导入了7709张图片)
图像是图像元灰度值的纪录, 以行列数据矩阵表示, 一般信息量比较大。直接读取图像的信息存入数据库中, 不但增加了数据库的容量, 而且增加了计算机的负担。若直接根据图像的路径名称建立图像地址库, 可有效提高计算机的计算效率。当需要提取图像时, 再根据图像的地址, 对图像进行检索, 平时, 只需对图像的基本信息进行管理。Path.txt导入数据库的结果如图3所示:
图3 图库中每幅图像的路径
通过执行各个特征操作类,读取图像、计算图像特征值、特征值入库。生成表如下:
图4 颜色特征表
图5 纹理特征表
图6 Hash特征表
图7 形状特征表
2.所采用算法思想
图像去躁——中值滤波
(1)将图像从RGB颜色空间转至HSI颜色空间;
(2)对HSI模型的三个分量分别求其前三阶中心矩,得到9个特征值。
(1)图像灰度化Gray=0.30*R+0.59*G+0.11*B;
(2)降低图像灰度等级,把图像256个灰度级按顺序分为8个区间;
(3)然后获得图像 0度,45度,90度,135度四个方向的灰度共生矩阵;
(4)求每个灰度共生矩阵的纹理一致性,纹理对比度,纹理熵;
(5)求每个灰度共生矩阵的四个值的期望和标准差,得到8个特征值。
(1)将图像缩小为32*32大小;
(2)对32*32大小图像灰度化Gray=0.30*R+0.59*G+0.11*B;
(3)对32*32大小图像进行离散余弦变换;
计算DCT:对图像进行二维离散余弦变换:
对图像进行二维离散余弦变换(2D-DCT)的步骤
1.获得图像的二维数据矩阵f(x,y);
2.求离散余弦变换的系数矩阵A;
3.求系数矩阵对应的转置矩阵AT;
4.根据公式F=A[f(x,y)]AT计算离散余弦变换;
(4)用32*32大小图片前面8*8大小图片处理并计算这64个像素的均值;
只保留矩阵左上8*8区域
(5)8*8的像素值中大于均值的用1表示,小于均值的用0表示,得到一个64位二进制码作为该图像的phash值。
算法步骤:
(1)图像灰度化 Gray=0.30*R+0.59*G+0.11*B;
(2)用中值滤波算法对图像进行平滑滤波,用于消除噪声干扰,其中需要用到排序算法,将 3*3 窗口的像素值进行排序取中间值;
(3)用 sobel 算子对图像进行锐化;
Sobel 算子:
X 方向:
Y 方向:
(4)对锐化后的图像用迭代阈值法进行二值化;
①选择一个初始阈值 t1,根据 t1将图像分割为 G1和 G2两部分,G1包含所有小于等于t1的 像素,G2包含所有大于 t1像素; ②分别求出 G1和 G2的平均灰度值 u1和u2;
③计算新的阈值t2=( u1+ u2)/2;
④如果| t1- t2|<=t0(t0为预先指定的很小的正数),即迭代过程中前后两次阈值很接近时, 中止迭代,否则t1= t2,重复上述过程。
(5)计算图像的 Hu 不变矩和离心率作为特征值,并对其进行归一化;
(6)将特征值存如图像特征数据库中。
3.详细实现过程
3.1图像预处理(prepare类)
连接数据库,将txt文件中的路径导入数据库“image”表,表中包含id,address两列,id递增。
注:检索时通过匹配特征值获取id值,通过id值查询address图片地址,id唯一标识。
(1)图像灰度化Gray=0.30*R+0.59*G+0.11*B;
(2)降低图像灰度等级,把图像256个灰度级按顺序分为8个区间;
(3)然后获得图像0度,45度,90度,135度四个方向的灰度共生矩阵;
(4)求每个灰度共生矩阵的纹理一致性,纹理对比度,纹理熵;
(5)求每个灰度共生矩阵的四个值的期望和标准差,得到8个特征值。
(1)将图像缩小为32*32大小;
(2)对32*32大小图像灰度化Gray=0.30*R+0.59*G+0.11*B;
(3)对32*32大小图像进行离散余弦变换;
(4)用32*32大小图片前面8*8大小图片处理并计算这64个像素的均值;
(5)8*8的像素值中大于均值的用1表示,小于均值的用0表示,得到一个64位二进制码作为该图像的phash值。
(6)连接数据库,将特征值插入数据库“hash”表,表中包含id,feature两列,id递增。
(1)图像灰度化Gray=0.30*R+0.59*G+0.11*B;
(2)灰度图二值化,空白为0,其余为1
(3)计算重心、二阶矩、三阶矩(中心矩),中心矩规范化
(4)计算不变矩
(5)连接数据库,将7个特征值插入数据库“shape”表,表中包含id,shape0,shape1,shape2,shape3,shape4,shape5,shape6共8列,id递增。
(1)点击按钮获得待匹配文件路径;
(2)根据路径计算对应图片的纹理的8个特征值;
(3)连接数据库,查询纹理数据库“texture”的所有值;
(4)遍历查询结果,分别获得每行第2~9列的8个特征值并保存;
(5)将计算得到的8个特征值分别与获得的数据库中每行8个特征值进行匹配(使用余弦定理);
(6)指定一个序号从1开始,用TreeMap保存该序号与匹配的返回值;
(7)按TreeMap的Value值从大到小进行排序,取前12个列表序号,保存为id值;
(8)根据id值查询“image”表得到对应的address路径;
(9)通过路径弹窗显示对应的图片。
(1)点击按钮获得待匹配文件路径;
(2)根据路径计算对应图片的hash特征值;
(3)连接数据库,查询hash数据库“hash”的所有值;
(4)遍历查询结果,分别获得每行第2列的特征值并保存;
(5)将计算得到的特征值分别与获得的数据库中每行特征值进行匹配(使用汉明距离);
(6)指定一个序号从1开始,用TreeMap保存该序号与匹配的返回值;
(7)按TreeMap的Value值从大到小进行排序,取前12个列表序号,保存为id值;
(8)根据id值查询“image”表得到对应的address路径;
(9)通过路径弹窗显示对应的图片。
(1)点击按钮获得待匹配文件路径;
(2)根据路径计算对应图片的纹理的7个特征值;
(3)连接数据库,查询形状数据库“shape”的所有值;
(4)遍历查询结果,分别获得每行第2~8列的7个特征值并保存;
(5)将计算得到的8个特征值分别与获得的数据库中每行7个特征值进行匹配(使用余弦定理);
(6)指定一个序号从1开始,用TreeMap保存该序号与匹配的返回值;
(7)按TreeMap的Value值从大到小进行排序,取前12个列表序号,保存为id值;
(8)根据id值查询“image”表得到对应的address路径;
(9)通过路径弹窗显示对应的图片。
4.实验结果分析
图7 图像预处理
初始界面(如图8):
图8 初始界面
点击浏览后弹窗选择文件(如图9):
图9 选择图片
选择文件后,将文件地址显示在Textfield框中,并显示当前图像(如图10):
图10 显示已选路径和图片
点击“基于颜色检索”按钮,按相似度从大到小循环显示图片(如图11):
图11 基于颜色检索结果
因为输入图片的颜色较为复杂,因此返回的结果低于预期,但返回的结果集之间差距较小。
点击“基于纹理检索”按钮,按相似度从大到小循环显示图片(如图12):
图12 基于纹理检索结果
结果较为准确,除了极个别的结果明显与输入不符以外,其它结果都较为准确,可以看出基于纹理检索的识别率较高。
点击“基于指纹检索”按钮,按相似度从大到小循环显示图片(如图13):
图13 基于指纹检索结果
结果较为准确,能保证第一个结果准确,但是中间有误差。
点击“基于形状检索”按钮,按相似度从大到小循环显示图片(如图14):
图14 基于形状检索结果
除了第一个结果,其它结果并不准确,因此基于该方法有待改善。
矩是用来描述随机变量的某些特征的数字,这里分别计算了HSI的前三阶中心矩,用来作为图像像素的特征值。
利用余弦定理计算9个特征值的相似度,对于颜色比较单一的图像更为准确;
该方法研究了图像纹理中灰度级的空间依赖关系。它对灰度的分布特性是通过对灰度值不同的像素的分布来表示的,所以对那些灰度比较集中,轮廓比较鲜明的图像的识别能力更强。
利用余弦定理计算8个特征值的相似度,准确度比较高。
它构成了一个64位的整数,就是这张图片的指纹,它主要也是用缩略图搜原图并能达到较好的效果。
利用汉明距离计算hash特征值的相似度,对于轮廓比较鲜明的图像更为准确, 四种图像检索方式中,基于指纹检索的准确性相对最高。
对图像的形状特征提取采用Hu矩表示,其在图像像素数目一定的情况下,具有对图像的旋转、平移和尺度变化的不变性。
5.实训总结和心得
(1)清空数据库表(id重置):
TRUNCATE TABLE table1
(2)求HSI的前三阶中心矩时,变量太多容易弄错;
(3)弄懂图像的灰度共生矩阵相关参数的意义及求法;
(4)掌握phash算法的步骤;
(5)学会java swing的基本页面布局,学会使用监听事件;
(6)学会TreeMap的按值排序算法:
ArrayList
Collections.sort(entryArrayList, new Comparator
public int compare(Map.Entry
因为之前已经接触过图像处理方面的知识,所以这次的项目处理起来难度不大,而且了解了更多图像处理的知识,包括图像的预处理及各种图像检索的方法,其中感知哈希方法识别率较高,对于形状比较丰富的图片,形状不变矩法分辨能力较低,Hu不变矩一般用来识别图像中大的物体,对于物体的形状描述得比较好,图像的纹理特征不能太复杂,像识别水果的形状,或者对于车牌中的简单字符的识别效果会相对好一些。
github:https://github.com/Gonlandoo/CBIR19