精华内容
参与话题
问答
  • 以图搜图

    千次阅读 2018-01-13 22:21:19
    以图搜图,查找类似图片 点击搜图,上传图片,会找出与之相似的图片(google搜图,百度搜图),图片相似度越高就越排在前面。 根据Neal Krawetz博士的解释,实现相似图片搜索的关键技术叫做“感知哈希算法”...

    以图搜图,查找类似图片

    点击搜图,上传图片,会找出与之相似的图片(google搜图,百度搜图),图片相似度越高就越排在前面。

    根据Neal Krawetz博士的解释,实现相似图片搜索的关键技术叫做“感知哈希算法”(Perceptualhash algorithm),它的作用是对每张图片生成一个“指纹”(fingerprint)字符串,然后比较不同图片的指纹,结果越相近,就说明图片越相似。

    从网上看到一个简单的java实现,如下:

    首先,预处理:读取图片

    第一步,缩小尺寸

    将图片缩小到8x8的尺寸,总共64个像素。这一步的作用是去除图片的细节,只保留结构、明暗信息等基本信息,摒弃不同尺寸、比例带来的图片差异。

    第二步,简化色彩

    将缩小后的图片,转为64级灰度。也就是说,所有像素点总共只有64种颜色。

    第三步,计算平均值

    计算所有64个像素的灰度平均值。

    第四步,比较像素的灰度。

    将每个像素的灰度,与平均值进行比较。大于或等于平均值,记为1;小于平均值,记为0.

    第五步,计算哈希值。

    将上一步的比较结果,组合在一起,就构成了一个64位的整数,这就是这张图片的指纹。组合的次序并不重要,只要保证所有图片都采用同样的次序就行了。

    得到指纹后,就可以对比不同的图片,看看64位中有多少位是不一样的。在理论上,这等同于计算“汉明距离”(Hammingdistance)。如果不相同的数据位不超过5,就说明两张图片很相似;如果大于10,就说明这是两张不同的图片。可以将几张图放在一起,也计算出其汉明距离对比,就可以看看两张图片是否相似。

    该算法的优点:快速简单,不受图片大小缩放的影响,缺点是图片的内容不能变更。如果在图片上加几个文字,它就认不出来。所以,其最佳用途是根据缩略图,找出原图。

    实际中,往往采用更强大的pHash算法和SIFT算法,他们能够识别图片的变形。只要变形程度不超过25%,他们就能匹配原图。这些算法虽然更复杂,但是原理与上面的简便算法是一样的,就是先将图片转化成Hash字符串,然后进行比较。

     

     

     

    展开全文
  • 《深度学习之以图搜图实战(PyTorch + Faiss) 》课程从实战的角度出发,方案来源于工业界实际业务应用(例如:京东、淘宝、拍照搜题、搜索引擎搜索业务等)。通过深度学习工具PyTorch 完成图片特征抽取,结合...
  • 图像搜索:以图搜图

    千次阅读 2019-03-27 20:31:17
    以图搜图 随着数字时代的到来,单单的文字搜素已经无法满足人们的搜索了,图像搜索,甚至是视频搜索都已经比较成熟。本文大致讲解下图像搜索: 原理 搜索项目:主要分为三个部分——图像特征抽取,构建搜素库,构建...

    以图搜图

    随着数字时代的到来,单单的文字搜素已经无法满足人们的搜索了,图像搜索,甚至是视频搜索都已经比较成熟。本文大致讲解下图像搜索:

    发展历程

    在这里插入图片描述

    原理

    搜索项目:主要分为三个部分——图像特征抽取,构建搜素库,构建索引。

    • 第一步:就是选取好合适的图像特征抽取方法,传统的方法有各种图像处理的方法,比如hog直方图,小波过滤等方法提取特征,现有比较热门的深度学习方法,比如卷积神经网络等;根据实际情况进行合理选择,一般而言建议使用卷积神经网络方法,但复杂的系统都会结合二者一起使用,比如淘宝的拍立淘等。
    • 第二步:使用特征抽取器对图像库抽取特征,并以向量的形式存储起来;
    • 第三步:构建索引,索引的好坏影响搜索速度,常用的有哈希编码等;

    在这里插入图片描述

    过程

    给定一张图像,首先经过主体检测等,或者全图抽取特征;之后与图像库中的图像特征进行特征匹配,一般计算余弦相似度指标,余弦相似度可以用来衡量两个向量的相似度,关于这方面的具体介绍可以看博主的另外一篇关于余弦相似度的介绍。最后按照相似度的大小进行排序,输出匹配结果即可。

    注意事项:

    • 是否进行主体检测
    • 搜索时候是否有比较快速的方法,比如knn
    • 其他的优化手段

    结果

    红色方框是查询图,绿色方框是完全匹配的结果,其它是最相似的top。
    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述

    展开全文
  • Delphi 百度搜图 以图搜图 返回Json 调用百度的接口 可以自行在百度智能云申请 个账号 申请建库。
  • opencv以图搜图

    2017-12-06 17:01:44
    使用opencv2.4.9 使用VS2013 基于图像直方颜色空间比较
  • 在Windows10+vs2013+opencv3.00+qt5.6.0平台利用哈希感知算法实现以图搜图软件,可以输入图片,在数据库中搜索类似的图片。也可以对图片进行训练写入数据库。(相关博客:...
  • 实现了基本的本地识图功能,就两个文件,接下来复杂的功能就得多家几个文件了就变得麻烦,先发出来damo吧。 可以实现精确识图功能 缩略那样的 界面没优化
  • python 以图搜图

    千次阅读 2019-02-18 09:51:17
    import os import cv2 as cv import numpy as np import pandas as pd import matplotlib.pyplot as plt #读取文件 def read_img(): imgs = [] # walk会返回3个参数,分别是路径,目录list,文件list ...
    import os
    import cv2 as cv
    import numpy as np
    import pandas as pd
    import matplotlib.pyplot as plt
    
    #读取文件
    def read_img():
        imgs = []
        # walk会返回3个参数,分别是路径,目录list,文件list
        for path, lists, frame in os.walk(文件名):
            for f in frame:
                #读取中文路径图像
                img = cv.imdecode(np.fromfile(path + "/" + f, dtype=np.uint8), 1)
                imgs.append(img)
        return frame,imgs
    #把图像分为五部分
    def fif_img(img):
        img= cv.cvtColor(img, cv.COLOR_BGR2HSV)
        h,w = img.shape[:2]
        cv.line(img,(int(w/2),0),(int(w/2),h),(255,0,0),2)
        cv.line(img,(0,int(h/2)),(w,int(h/2)),(255,0,0),2)
        clie = np.zeros((h,w),np.uint8)
        cv.ellipse(clie,(int(w/2),int(h/2)),(int(0.375*w),int(0.375*h)),0,0,360,255,-1)
        img1 = cv.bitwise_and(img,img,mask=clie)
    
        retra,clie1 = cv.threshold(clie,0,255,cv.THRESH_BINARY_INV)
        clie2 = clie1.copy()
        clie3 = clie1.copy()
        clie4 = clie1.copy()
        cv.rectangle(clie1,(int(w/2),0),(w,h),0,-1)
        cv.rectangle(clie1,(0,int(h/2)),(w,h),0,-1)
        img2 = cv.bitwise_and(img,img,mask=clie1)
    
        cv.rectangle(clie2,(0,0),(int(w/2),h),0,-1)
        cv.rectangle(clie2,(int(w/2),int(h/2)),(w,h),0,-1)
        img3 = cv.bitwise_and(img,img,mask=clie2)
    
        cv.rectangle(clie3,(0,0),(w,int(h/2)),0,-1)
        cv.rectangle(clie3,(int(w/2),int(h/2)),(w,h),0,-1)
        img4 = cv.bitwise_and(img,img,mask=clie3)
    
        cv.rectangle(clie4,(0,0),(w,int(h/2)),0,-1)
        cv.rectangle(clie4,(0,int(h/2)),(int(w/2),h),0,-1)
        img5 = cv.bitwise_and(img,img,mask=clie4)
        imgs = []
        imgs.extend([img1,img2,img3,img4,img5])
        return imgs
    
    def zft_img(name,img_score):
        colum = dict()
        for i in range(len(img_score)):
            hist = []
            imgs = fif_img(img_score[i])
            for ig in range(len(imgs)):
                hist_img = cv.calcHist([imgs[ig]], [0,1,2], None,(8,12,3), [0,180,0,256,0,256])
                #归一化
                hist.append(pd.Series(cv.normalize(hist_img,hist_img).flatten()))
            colum[name[i]] = pd.concat(hist)
        colum = pd.DataFrame(colum)
        return colum
    
    #一张图像的直方图
    def first_zft(name,image):
        colum = dict()
        hist = []
        imgs = fif_img(image)
        for ig in range(len(imgs)):
            hist_img = cv.calcHist([imgs[ig]], [0, 1, 2], None, (8, 12, 3), [0, 180, 0, 256, 0, 256])
            # 归一化
            hist.append(pd.Series(cv.normalize(hist_img, hist_img).flatten()))
        colum[name] = pd.concat(hist)
        colum = pd.DataFrame(colum)
        return colum
    
    
    #储存
    def Storage_img(colum):
        colum.to_csv('temp/img.csv',index=False)
    
    #欧式距离
    def o_distance(new_data,old_data):
        name = old_data.columns
        distances = dict()
        for i in range(len(name)):
            distance = 0
            for j in range(len(new_data.values)):
                distance = distance + ((new_data.values[j] - old_data[name[i]].values[j]) ** 2)
            distances[name[i]] = np.sqrt(distance)
        dist = sorted(distances.items(), key=lambda s: s[1])
        print(dist)
        name_img = []
        for i in range(10):
            print(dist[i])
            name_img.append(dist[i][0])
        return name_img
    
    #卡方距离
    def ka_distance(new_data,old_data):
        name = old_data.columns
        distances = dict()
        for i in range(len(name)):
            distance = 0
            for j in range(len(new_data.values)):
                distance = float(distance) + float(((new_data.values[j] - old_data[name[i]].values[j]) ** 2)/(new_data.values[j] + old_data[name[i]].values[j] + 0.0000001))
            distances[name[i]] = distance * 0.5
        dist = sorted(distances.items(), key=lambda s: s[1])
        name_img = []
        for i in range(10):
            name_img.append(dist[i][0])
        return name_img
    
    
    #保存图像放入新文件夹
    def write_img(img):
        print("类似图像:",img)
        imgs = dict()
        for path, lists, frame in os.walk(文件名):
            for f in frame:
                # 读取中文路径图像
                image = cv.imdecode(np.fromfile(path + "/" + f, dtype=np.uint8), 1)
                imgs[f] = image
        for ig in img:
            cv.imwrite(保存路径+ig,imgs[ig])
    
    # name,image = read_img()
    # # zft_img(name,image)
    # # Storage_img(zft_img(name,image))
    
    #-*- coding: utf-8 -*-
    import cv2 as cv
    import numpy as np
    import pandas as pd
    from yitusoutu import *
    
    img_name = input('请输入图像路径名称:')
    # file = open(img_name,'r')
    #读入中文
    img = cv.imdecode(np.fromfile(img_name, dtype=np.uint8), 1)
    cv.imshow('img',img)
    name,img_score = read_img()
    old_colum = zft_img(name,img_score)
    new_colum = first_zft(img_name,img)
    write_img(o_distance(new_colum,old_colum))
    cv.waitKey(0)
    cv.destroyAllWindows()
    展开全文
  • 阿里1688图片搜索爬虫案例图片上传接口sign生成接口数据详情接口代码部分 ... 图片上传接口 post请求,form表单中有signature签名 ...全局搜素找一下signature,发现了一个返回signature的接口。...这个接口也有一个变动...


    网址 :https://www.1688.com/

    在1688.com 使用程序完成图片上传功能。

    在这里插入图片描述


    图片上传接口

    在这里插入图片描述
    post请求,form表单中有signature签名
    在这里插入图片描述

    sign生成接口

    全局搜素找一下signature,发现了一个返回signature的接口。

    在这里插入图片描述
    接口链接: https://open-s.1688.com/openservice/ossDataService
    在这里插入图片描述
    这个接口也有一个变动的参数 appKey
    在这里插入图片描述
    全局搜索后在js文件中查看一下
    在这里插入图片描述
    往下找就可以发现appkey的生成了。
    在这里插入图片描述
    通过debug来查看生成规则。
    在这里插入图片描述
    获取加密时间的接口: https://open-s.1688.com/openservice/.htm?
    参数: outfmt =json&serviceIds=cbu.searchweb.config.system.currenttime

    需要先请求这个接口,获取加密时间。

    再把时间和appName 传入 getAppKey。
    在这里插入图片描述
    然后e= “appname ; t” ,appName的base64编码之后的结果是 “cGNfdHVzb3U=”
    在这里插入图片描述

    经过encode64返回 i ( appkey)

    在这里插入图片描述

    然后通过上面生成sign的接口: https://open-s.1688.com/openservice/ossDataService

    传入参数就行请求,就可以返回signature,policy,accessid。

    params = {
         "appName": key,
         "appKey": base64.b64encode(appkey.encode("utf-8")),
             }
    

    数据详情接口

    图片上传之后,返回的数据接口:
    https://search.1688.com/service/imageSearchOfferResultViewService?

    在这里插入图片描述
    参数:
    在这里插入图片描述
    imageAddress是在上传图片之后返回的值
    requestId 初始化参数,可以为空。
    整个流程就是这样了,接着构造请求就可以获取数据了。
    在这里插入图片描述


    代码部分

    # -*- coding: utf-8 -*-
    
    import time
    import base64
    import os.path
    from urllib.parse import urlparse
    import io
    import random
    import string
    import requests
    import contextlib
    
    
    def request_get(url, params, headers):
        try:
            with contextlib.closing(requests.get(url=url, params=params, headers=headers, timeout=8)) as req:
                data = req.json()
                return "succ", data
        except Exception as e:
            print(e)
            return "fail", {}
    
    
    def request_post(url, data=None, files=None, headers=None):
        try:
            with contextlib.closing(
                    requests.post(url=url, data=data, files=files, headers=headers, timeout=10)) as req:
                res = req.text
                return "succ", res
        except Exception as e:
            print(e)
            return "fail", {}
    
    
    
    def get_random_str(k):
        """
        choices:python新版本 新增的权重抽取
        """
        return ''.join(random.choices(string.ascii_letters, k=k))
    
    
    
    class Ali1688(object):
    
        def __init__(self):
            self.upload_url = 'https://cbusearch.oss-cn-shanghai.aliyuncs.com/'     # 上传图片
            self.sign_url = "https://open-s.1688.com/openservice/ossDataService"    # 获取sign
            self.imageSearch_service_url = "https://open-s.1688.com/openservice/imageSearchOfferResultViewService"
            self._headers()
            self.search_page_size = 40
    
        def setSearchPageSize(self, pageSize):
            self.search_page_size = pageSize
    
        def _headers(self):
            headres = {
                'Origin': "https://www.1688.com",
                "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36",
                "Accept": "*/*",
                "Cache-Control": "no-cache",
                "cookie": "_samesite_flag_=true; _tb_token_=ee5138b911917; cookie2=163f6e3722351213514df4c9ab9116f6; t=96e8d0ab6d636f19306c429b276db552; __cn_logon__=false; ali_ab=120.253.224.246.1587973275662.6; l=caJGIJNTkgnFkWiGkSYyeKDwPQuOAiFJdcPgDahIhDlFGpKMvULclIQGPBDmDhmDdCsLYIU; na=ijBRbdRXZeKwRcTHilfNHSt+; ",
                "refer": "https://www.1688.com/"
            }
            self.headers = headres
    
    
        def get_dateset(self):
            '''
            获取加密时间
            '''
            url = "https://open-s.1688.com/openservice/.htm?"
            params = {
                "serviceIds": "cbu.searchweb.config.system.currenttime",
                "outfmt": "json",
            }
            status, data = request_get(url, params, self.headers)
            return status, data
    
        def get_sign(self, data_set):
            '''
            用于获取 sign 用于加密
            '''
            url = 'https://open-s.1688.com/openservice/ossDataService'
            key = str(base64.b64decode("cGNfdHVzb3U=".encode("utf-8")), encoding="utf-8")
            appkey = "{};{}".format(key, str(data_set))
    
            params = {
                "appName": key,
                "appKey": base64.b64encode(appkey.encode("utf-8")),
            }
    
            status, data = request_get(url, params, self.headers)
    
            data = data.get('data', {})
    
            signature = data.get('signature', '')
            policy = data.get('policy', '')
            accessid = data.get('accessid', '')
    
            return status, signature, policy, accessid
    
    
        def upload_img(self, filename, signature, policy, accessid):
            """
            用于上传图片
            :return:
            """
            url = 'https://cbusearch.oss-cn-shanghai.aliyuncs.com/'
            key = "cbuimgsearch/" + get_random_str(10) + str(int(time.time()) * 1000) + ".jepg"
            name = get_random_str(5) + ".jpeg"
    
            if os.path.exists(filename):
                bytestream = open(filename, "rb").read()
            else:
                us = urlparse(filename)
                if not us:
                    return 'fail', None
                r = requests.get(filename)
                bytestream = io.BytesIO(r.content)
    
            files = {
                "name": (None, name),
                "key": (None, key),
                "policy": (None, policy),
                "OSSAccessKeyId": (None, accessid),
                "success_action_status": (None, 200),
                "callback": (None, ""),
                "signature": (None, signature),
                "file": (name, bytestream)
            }
    
            status, res = request_post(url, data=None, files=files, headers=self.headers)
            return status, key
    
    
        def img_search(self, img_key, dataSet, beginPage=1):
            """
            用于上传图片搜索商品列表
            """
            app_name = "pc_tusou"
    
            app_key = base64.b64encode('{};{}'.format(app_name,dataSet).encode("utf-8"))
    
            appKey = str(app_key, encoding="utf8")
    
            request_params = {
                "imageAddress": img_key,
                "imageType": "oss",
                "pageSize": self.search_page_size,
                "beginPage": beginPage,
                "categoryId": "null",
                "appName": app_name,
                "appKey": appKey,
                "callback": ""
            }
            status_desc, data = request_get(self.imageSearch_service_url, request_params, headers=self.headers)
            if status_desc == "succ":
                return 'succ', data
            else:
                return 'fail', None
    
    
        def run(self, filename, need_products=False):
            status, data = self.get_dateset()
            data_set = data.get('cbu.searchweb.config.system.currenttime', {}).get('dataSet', '')
            # 获取相关的 接口验证参数。同时 获取生成的 图片key
            status, signature, policy, accessid = self.get_sign(data_set)
            # uoload image file
            status, key = self.upload_img(filename, signature, policy, accessid)
            # 上传成功后,拼接生成的 查询 URL
            if status == "succ":
                url_res = 'https://s.1688.com/youyuan/index.htm?tab=imageSearch&imageType=oss&imageAddress={}&spm='.format(
                    key)
                if need_products == False:
                    return url_res
                else:
                    status_desc, data = self.img_search(key, data_set)
                    if status_desc == 'succ':
                        return data
                    return None
            else:
                return ""
    
    
    if __name__ == '__main__':
        imagePath = './lxcode.png'   # 图片地址
        url = Ali1688().run(imagePath)
        print(url)
    
    
    展开全文
  • 以图搜图BOF

    千次阅读 2017-10-29 15:48:30
    matlab+VC 实现Bag of features     Bag of features(Bof)一种是用于图像和视频检索的算法,此算法的神奇之处,就在于对于不同角度,光照的图像,基本都能在图像库中正确检索。而写这篇文章的目的也就...
  • php以图搜图

    千次阅读 2016-05-15 21:29:52
    以图搜图 感知哈希算法 count 10 两张不同的图片 var_dump(ImageHash::run(‘./1.png’, ‘./psb.jpg’)); class ImageHash { const FILE_NOT_FOUND = '-1'; const FILE_EXTNAME_ILLEGAL = '-2'; ...
  • jsp+struts2 编写的 以图搜图demo,图片库 目录为WebRoot\medias\images,上传图片后会自动获取该目录下所有图片文件并比对。
  • php 以图搜图

    2015-09-25 10:02:00
    感知哈希算法count < =5 匹配最相似count > 10 两张不同的图片var_dump(ImageHash::run('1.jpg’, '2.jpg’));<?php class ImageHash { ... const FILE_EXTNAME_ILLEGAL =...
  • 以图搜图软件

    2020-08-27 08:40:56
    Lire, 开源java的CBIR库 http://www.semanticmetadata.net/lire/ Octagon, java的CBIR库http://octagon.viitala.eu/ University of Washington, CBIR http://www.cs.washington.edu/research/imagedatabase/ ...WebSe
  • 本课程主要给大家介绍人工智能的相关发展和应用,同时通过案例介绍基于深度CNN的图像特征提取和相似计算的原理和简单应用。通过本次课程可以让你轻松地对人工智能有全面的了解。
  • Chrome插件-《二箱+以图搜图》让你在搜图方面随心所欲.zip。一款简单实用的搜图小工具,如果你是一名设计师, 可以帮你快速查找他人设计作品中所用的素材来源, 提升你的工作效率。
  • 前阵子在阮一峰的博客上看到了这篇《相似图片搜索原理》博客,就有一种冲动要将这些原理实现出来了。...Google "相似图片搜索":你可以用一张图片,搜索互联网上所有与它相似的图片。...打开Google图片搜索页
  • C#实现以图搜图

    千次阅读 2019-09-09 11:53:05
    朋友们,我是床长!... 前言 最近在逛淘宝时发现了淘宝的图片搜索功能,可能是我太Low了这个技术点已经实现很长时间了。想想自己能不能实现这个功能,起初我是这么想的,对两张图片从左上角的第一个像素点一直比较到...
  • 模仿百度以图搜图功能/淘宝的拍立淘功能,使用的模型vgg-16,环境配置完毕可以直接使用,有问题欢迎交流。 开发环境: # windows 10  # tensorflow-gpu 1.8 + keras  # python 3.6
  • 以图搜图相关资料

    千次阅读 2015-05-05 15:48:05
     基于内容的图片检索(Content Based Image Retrieval, CBIR),也有人称之为以图搜图,是一个很老的研究领域,它是利用机器学习、模式识别、计算机视觉等相关技术对图片的内容进行分析、检测、检索的一种应用...
  • 以图搜图架构初稿

    千次阅读 2018-07-14 11:34:57
    一、图片集离线增量1、获取近一个月的新款,每个货号获取前5张图片,2、对其进行裁剪拼接图片地址(按最大900比例裁剪,使用存储地址,不使用CND)如:...
  • 以图搜图功能实现

    千次阅读 2015-08-12 16:06:28
    以图搜图这个功能相当实用, 之前在实现这个功能的时候, 有一些笔记, 今天就整合成博文, 分享给大家。 这个demo主要实现的功能包括: 自定义拍照界面图像识别以图搜图信息获取(通过识别出的图像, 获取...

空空如也

1 2 3 4 5 ... 20
收藏数 501
精华内容 200
关键字:

以图搜图