相似图片搜索

原文链接

图片搜索方法简述

1.感知哈希算法(perceputal hash algorithm)
  • 原理:对每张图片生成一个“指纹”字符串,然后比较不同图片的指纹。结果越相近,就说明图片越相似
  1. 步骤:
    • step1: 缩小尺寸,将图片缩小到8x8大小,摒弃图片的细节,只保留结构、明暗等特征
    • step2: 简化色彩,图片转为64度灰,即所有像素点总共只有64种颜色。(原灰度图每个像素范围为0~255,表示256度灰,那么每个像素值除以4就得到了64度灰)
    • step3: 计算平均值,计算所有64个像素的灰度平均值
    • step4: 比较像素的灰度,将每个像素的灰度都与平均值比较,大于平均值的记1,不然记0
    • step5: 计算哈希值,将上一步的比较结果组合构成64位的整数,这就是图片的指纹
    • step6: 通过计算汉明距离得到图片相似度
  2. 代码实现:imghash
  3. 优缺点:简单快速,不受图片大小的缩放影响,缺点是图片的内容不能变更。如果在图片上加几个文字,它就认不出来了。所以,它的最佳用途是根据缩略图,找出原图。
2.颜色分布法
  • 原理:任何颜色都是由RGB三原色构成,所以一张图片会有4张直方图(三原色直方图+最后合成的直方图。如果每种原色都可以取256个值,可以将0~255分成四个区:0~63为第0区,64~127为第1区,128~191为第2区,192~255为第3区。这意味着红绿蓝分别有4个区,总共可以构成64种组合(4的3次方),任何一种颜色必然属于这64种组合种的一种,这样就可以统计每一种组合包含的像素数,形成一个长度位64的特征向量。
3.内容特征法
  • 步骤:
    • 将原图转换为1张较小的灰度图像,比如5050像素。(Gray = R\0.299 + G*0.587 + B*0.114)
    • 确定一个阈值,将灰度图片转换为黑白轮廓图片。
  • 核心:如何确定阈值->“大津法”
    • 假设一张图片共有n个像素,其中灰度值小于阈值的像素为n1个,大于等于的为n2个。则可以计算得到两种像素各自的比重。 w1 = n1 / n ; w2 = n2 / n
    • 假设所有灰度值小于阈值的像素的平均值和标准差为u1和delta1,所有大于等于阈值的像素的平均值和方差为u2和delta2。则类内差异 = w1*(delta1的平方) + w2*(delta2的平方);类间差异 = w1*w2*(u1-u2)^2。可以证明得到类内差异的最小值等同于得到类间差异的最大值,证明见下图。
    • 用穷举法得到阈值。阈值从灰度的最低值到最高值依次取一遍,带入使得类内差异最小或者类外差异最大的值即为最终的阈值。

mark