关于相似图片搜索

先说一下搜索的原理,其实就是不管你搜索什么,都是将你要搜的东西提取出特征值,然后按照特征值比较相似度,按照相似度排序呈献给用户就可以了,所以总共来说需要解决两个问题,一个是如何取得特征值,一个是如何计算相似度。

首先说特征值,特征值可以用图片的颜色比例来,比如python用PIL中的histogram函数就可以得到颜色分布

这幅图的颜色分布直方图是这样的

通过这样我们就得到了一个图像的特征值,这种方法是得到的颜色的分配,还有另一种方式得到的则是图像的内容特征。

基本想法是将图片弄成8*8的小图片这样摒弃掉细节内容,将图片灰度,根据灰度确定一个阈值,然后转换成01矩阵,其他的内容都好说,简要说一下确定阈值的方法,有一个知名的方法叫OSTU,又叫大律法,他的想法是使得分配后的方差尽可能的大。再说的具体点就是

对图像Image,记t为前景与背景的分割阈值,前景点数占图像
比例为w0,平均灰度为u0;背景点数占图像比例为w1,平均灰
度为u1。 图像的总平均灰度为:u=w0*u0+w1*u1。从最小灰
度值到最大灰度值遍历t,当t使得值
g=w0*(u0-u)2+w1* (u1-u)2 最大时t即为分割的最佳阈值。 

下面是具体的程序:

#coding=utf-8  
import Image,ImageDraw  
ret = {}
def twoValue(image,G):  
    for y in xrange(0,image.size[1]):  
        for x in xrange(0,image.size[0]):  
            g = image.getpixel((x,y))  
            if g > G:  
                ret[(x,y)] = 1  
            else:  
                ret[(x,y)] = 0
def OtsuGray(image):  
    hist = image.histogram()    
    totalH = 0  
    for h in range(0,256):  
        v =hist[h]  
        if v == 0 : continue  
        totalH += v*h  
    width  = image.size[0]  
    height = image.size[1]  
    total  = width*height   
    v = 0  
    gMax = 0.0  
    tIndex = 0  
    total0 = 0.0  
    total1 = 0.0  
    n0H   = 0.0  
    n1H   = 0.0  
    for t in range(1,255):  
        v = hist[t-1]  
        if v == 0: continue          
        total0 += v
        total1 = total - total0
        n0H += (t-1)*v
        n1H = totalH - n0H
        if total0 > 0 and total1 > 0:
            u0 = n0H/total0
            u1 = n1H/total1
            w0 = total0/total
            w1 = 1.0-w0
            uD = u0-u1
            g = w0 * w1 * uD * uD
            if gMax < g:  
                gMax   = g  
                tIndex = t                
    return tIndex
def saveImage(filename,size):  
    image = Image.new("1",size)  
    draw = ImageDraw.Draw(image)  
    for x in xrange(0,size[0]):  
        for y in xrange(0,size[1]):  
            draw.point((x,y),ret[(x,y)])  
    image.save(filename) 
def handle(filename,outputname):
    im = Image.open(filename)
    im = im.convert('L')
    otsu = OtsuGray(im)
    twoValue(im,otsu)
    saveImage(outputname,im.size)
if __name__=='__main__':
    handle('111.jpg','temp.jpg')

这样转换后的图片是这样子的

得到了特征值后就是计算相似度,比如第二种得到特征值的方法,我们只需将得到的矩阵进行异或,异或后,1越少的越相近,而对于第一种特征值最普遍的方法就是把他看成向量,然后想想向量的点乘,计算两个向量的夹角,夹角越小越相似,cos夹角=(a1*b1+a2*b2+a3*b3....)/(|a|*|b|),当然了,还有其他得到相似度的计算方法,这个就是具体问题具体对待了呢。

ps:话说根据本文的方法你也可以进行验证码识别的一些邪恶举动呢。。。但是不要做坏事哦~

pss:这篇文章介绍一些有趣的图像算法,有兴趣的童鞋可以围观

您可能喜欢:
我猜您可能还喜欢:
, , ,

有 42 条《关于相似图片搜索》的回复

  1. Lingshuang | #1

    wr大牛 你是不是心血来潮 开始研究图片搜索啊? 怎么从来没听你说过啊?

Trackbacks/Pingbacks:

  1. Thought this was cool: python中文分词 « CWYAlpha
  2. python中文分词 | 吃杂烩
  3. 基于AS3.0的相似图像搜索算法实现 | Limbo-Nova
  4. Thought this was cool: 谈谈SVD和LSA « CWYAlpha
  5. 相似图片搜索的原理(二) | Feisky
  6. 相似图片搜索的原理(二) | 文良颜丑
  7. 相似图片搜索的原理 | 随心录 - 天下无敌
  8. 相似圖片搜索的原理 - ::Game2.tw::台灣遊戲Blog - 台灣遊戲,網頁遊戲資訊博客,提供最新網頁遊戲報導和免費遊戲資料
  9. 相似图片搜索的原理(二) | 易资讯
  10. » 相似图片搜索的原理 华山派思过涯
  11. 相似图片搜索引擎 | 冉莹颖·邹市明
  12. Thought this was cool: 相似图片搜索的原理(二) | CWYAlpha
  13. 相似图片搜索的原理 | 赵星云的博客
  14. 图片相似搜索,其实原理挺简单(二) | 张衡Henry
  15. 相似图片搜索的原理(二) | 黄峰达 gmszone的测试博客
  16. INHAO™志 » 相似图片搜索的原理
  17. 相似图片搜索、算法、识别的原理解析(下) | 36大数据
  18. 相似图片搜索的原理(二) | 农夫庄园
  19. 相似图片搜索的原理 二 | Hoki自居地
  20. 相似图片搜索的原理(二) | 济宁SEO公司,济宁网站优化-流枫SEO服务
  21. 以图搜图 – 高清无码好方法 / 米范
  22. 相似图片搜索、算法、识别的原理解析(下) - 163大数据
  23. 相似图片搜索、算法、识别的原理解析(下) - 56iot
  24. 相似图片搜索的原理(二) – 苏demo的博客
  25. 相似图片搜索的原理(二) – 码农网
  26. Google相似图片搜索的原理概述 | 产品汪的笔记
  27. 相似图片搜索、算法、识别的原理解析(下) - 09大数据
  28. 相似图片搜索的原理(二) - code123
  29. 相似图片搜索、算法、识别的原理解析(下) | 可穿戴设备戴粉网
  30. 相似图片搜索、识别算法原理(下) – 机器人视觉
  31. 图片相似算法(1) | GOOD DEEP
  32. 相似图片搜索的原理 | 歪布IT笔记
  33. Safe Steroids Purchase
  34. 相似图片搜索、算法、识别的原理解析(下)_多维数
  35. 相似图片搜索的原理(二) – 我要备份
  36. 相似图片搜索、算法、识别的原理解析(下) - 算法网
  37. 以图搜图 相似图片搜索的原理(二) - 算法网
  38. 相似图片搜索原理四(内容特征法) - 算法网
  39. 相似图片搜索的原理 - 算法网
  40. 相似图片搜索原理四(内容特征法) - 内存网

发表回复