精华内容
下载资源
问答
  • 高清图片搜索引擎

    千次阅读 2017-08-01 09:12:12
    为了让你永久告别百度图片,我来总结...1.Zerospace - 高品質的 CC0 免費搜索框内写着大大的“搜索您想要的CC0图片”。那么问题来了:什么是CC0?Creative Commons,可参见台灣創用CC計畫。 也就是说,
     
    

    为了让你永久告别百度图片,我来总结一下高清图片搜索神站:

    1.Zerospace - 高品質的 CC0 免費圖片


    搜索框内写着大大的“搜索您想要的CC0图片”。那么问题来了:什么是CC0?Creative Commons,可参见台灣創用CC計畫

    也就是说,这里搜索到的高清图片提供免费下载,并且可以无偿使用,是无版权商用哦!设计师们的福音啊!




    2.Pixabay官网Free Images - Pixabay

    这里的高品质图片一样免费无版权任意使用!

    在所有的图像和视频Pixabay释放自由版权下创作共用CC0。你可以下载、修改、分发,并使用它们在任何你喜欢的任何东西,即使在商业应用程序中使用它们。不需要归属权。

    3.Awesome Wallpapers 免费的墙纸搜索网站。(有知友推荐bing更赞)



    4.Instant Logo Search 设计师专属:logo搜索神站。含全球各大著名品牌logo。

    下载格式有两种:png让你不用到PS里面去白底;更含SVG矢量图下载哦!


    5.再来一枚设计师和开发常用网站:http://www.iconfont.cn/阿里巴巴旗下的免费icon百科网站。

    目前有361049个icon,免费下载矢量源文件,选择时可以打包所有你感兴趣的放在购物车,Download时还可以选择颜色和大小,太贴心有木有!同时支持下载开发用代码。

    比如搜索关键词“work”看到的结果:



    6.人工智能海报设计:ARKie 智能设计助手 - 10秒帮你做海报

    ARK公司旗下的人工智能海报设计工具,也有微信端,根据文字自动匹配图片、字体和排版,10S生成,随意修改,满意为止。让人人都能做海报设计!(2017.5.18更新)



    其他Stocky 与 Unsplash ,提供大量无版权图片及少量视频和音乐。二者的区别在于Stocky 偏向于设计,Unsplash 偏向于摄影;可随意下载甚至商用。


    展开全文
  • OpenCV实现图像搜索引擎(Image Search Engine)

    万次阅读 热门讨论 2015-06-20 21:26:53
    ,生成原图图像特征并传入图片搜索匹配器。 图片搜索匹配内核 执行搜索匹配任务 。返回前 limit 个最佳匹配图像。 所需模块 numpy。 科学计算和矩阵运算利器。 cv2 。OpenCV的python模块接入。 re...

    欢迎参观我的博客HuHaoyu’s Blog

    简单介绍一下OpenCV

    OpenCV was designed for computational efficiency and with a strong focus on real-time applications. Written in optimized C/C++, the library can take advantage of multi-core processing. Enabled with OpenCL, it can take advantage of the hardware acceleration of the underlying heterogeneous compute platform. Adopted all around the world, OpenCV has more than 47 thousand people of user community and estimated number of downloads exceeding 9 million. Usage ranges from interactive art, to mines inspection, stitching maps on the web or through advanced robotics.

    OpenCV(Open Source Computer Vision Library)的计算效率很高且能够完成实时任务。OpenCV库由优化的C/C++代码编写而成,能够充分发挥多核处理和硬件加速的优势。OpenCV有大量技术社区和超过900万的下载量,它的使用范围极为广泛,如人机互动、资源检查、拼接地图等。

    0.Python+OpenCV实现图像搜索引擎

    之前看到谷歌和百度出了图像搜索引擎,查阅了相关资料深入了解了图像搜索引擎的算法原理。一部分参考了用Python和OpenCV创建一个图片搜索引擎的完整指南。决定自己实现一个简单的图像搜索引擎,也可以让自己更快地查找mac中的图片。为什么使用OpenCV+Python实现图像搜索引擎呢?

    • 首先,OpenCV是一个开源的计算机视觉处理库,在计算机视觉图像处理模式识别中有广泛的应用。接口安全易用,而且跨平台做的相当不错,是一个不可多得的计算机图像及视觉处理库。

    • 其次,Python的语法更加易用,贴近自然语言,极为灵活。虽然计算效率并不高,但快速开发上它远胜于C++或其他语言,引入pysco能够优化python代码中的循环,一定程度上缩小与C/C++在计算上的差距。而且图像处理中需要大量的矩阵计算,引入numpy做矩阵运算能够降低编程的冗杂度,更多地把精力放在匹配的逻辑上,而非计算的细枝末节。

    1. 图像搜索原理

    图像搜索算法基本可以分为如下步骤:

    • 提取图像特征。如采用SIFT、指纹算法函数、哈希函数、bundling features算法等。当然如知乎中所言,也可以针对特定的图像集群采用特定的模式设计算法,从而提高匹配的精度。如已知所有图像的中间部分在颜色空间或构图上有显著的区别,就可以加强对中间部分的分析,从而更加高效地提取图像特征。

    • 图像特征的存储。一般将图像特征量化为数据存放于索引表中,并存储在外部存储介质中,搜索图片时仅搜索索引表中的图像特征,按匹配程度从高到低查找类似图像。对于图像尺寸分辩率不同的情况可以采用降低采样或归一化方法

    • 相似度匹配。如存储的是特征向量,则比较特征向量之间的加权后的平方距离。如存储的是散列码,则比较Hamming距离。初筛后,还可以进一步筛选最佳图像集。

    2. 图片搜索引擎算法及框架设计

    基本步骤

    • 采用颜色空间特征提取器和构图空间特征提取器提取图像特征
    • 图像索引表构建驱动程序生成待搜索图像库的图像特征索引表
    • 图像搜索引擎驱动程序执行搜索命令,生成原图图像特征并传入图片搜索匹配器。
    • 图片搜索匹配内核执行搜索匹配任务。返回前limit个最佳匹配图像。

    所需模块

    • numpy。科学计算和矩阵运算利器。
    • cv2。OpenCV的python模块接入。
    • re。正则化模块。解析csv中的图像构图特征和色彩特征集。
    • csv。高效地读入csv文件。
    • glob。正则获取文件夹中文件路径。
    • argparse。设置命令行参数。

    封装类及驱动程序

    • 颜色空间特征提取器ColorDescriptor。

      1. 类成员bins记录HSV色彩空间生成的色相、饱和度及明度分布直方图的最佳bins分配。bins分配过多则可能导致程序效率低下,匹配难度和匹配要求过分苛严;bins分配过少则会导致匹配精度不足,不能表证图像特征。
      2. 成员函数getHistogram(self, image, mask, isCenter)。生成图像的色彩特征分布直方图。image为待处理图像,mask为图像处理区域的掩模,isCenter判断是否为图像中心,从而有效地对色彩特征向量做加权处理。权重weight5.0。采用OpenCV的calcHist()方法获得直方图,normalize()方法归一化。
      3. 成员函数describe(self, image)。将图像从BGR色彩空间转为HSV色彩空间(此处应注意OpenCV读入图像的色彩空间为BGR而非RGB)。生成左上、右上、左下、右下、中心部分的掩模。中心部分掩模的形状为椭圆形。这样能够有效区分中心部分和边缘部分,从而在getHistogram()方法中对不同部位的色彩特征做加权处理
    class ColorDescriptor:
        __slot__ = ["bins"]
        def __init__(self, bins):
            self.bins = bins
        def getHistogram(self, image, mask, isCenter):
            # get histogram
            imageHistogram = cv2.calcHist([image], [0, 1, 2], mask, self.bins, [0, 180, 0, 256, 0, 256])
            # normalize
            imageHistogram = cv2.normalize(imageHistogram, imageHistogram).flatten()
            if isCenter:
                weight = 5.0
                for index in xrange(len(imageHistogram)):
                    imageHistogram[index] *= weight
            return imageHistogram
        def describe(self, image):
            image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
            features = []
            # get dimension and center
            height, width = image.shape[0], image.shape[1]
            centerX, centerY = int(width * 0.5), int(height * 0.5)
            # initialize mask dimension
            segments = [(0, centerX, 0, centerY), (0, centerX, centerY, height), (centerX, width, 0, centerY), (centerX, width, centerY, height)]
            # initialize center part
            axesX, axesY = int(width * 0.75) / 2, int (height * 0.75) / 2
            ellipseMask = numpy.zeros([height, width], dtype="uint8")
            cv2.ellipse(ellipseMask, (centerX, centerY), (axesX, axesY), 0, 0, 360, 255, -1)
            # initialize corner part
            for startX, endX, startY, endY in segments:
                cornerMask = numpy.zeros([height, width], dtype="uint8")
                cv2.rectangle(cornerMask, (startX, startY), (endX, endY), 255, -1)
                cornerMask = cv2.subtract(cornerMask, ellipseMask)
                # get histogram of corner part
                imageHistogram = self.getHistogram(image, cornerMask, False)
                features.append(imageHistogram)
            # get histogram of center part
            imageHistogram = self.getHistogram(image, ellipseMask, True)
            features.append(imageHistogram)
            # return
            return features
    • 构图空间特征提取器StructureDescriptor。

      1. 类成员dimension。将所有图片归一化(降低采样)为dimension所规定的尺寸。由此才能够用于统一的匹配和构图空间特征的生成。
      2. 成员函数describe(self, image)。将图像从BGR色彩空间转为HSV色彩空间(此处应注意OpenCV读入图像的色彩空间为BGR而非RGB)。返回HSV色彩空间的矩阵,等待在搜索引擎核心中的下一步处理。
    class StructureDescriptor:
        __slot__ = ["dimension"]
        def __init__(self, dimension):
            self.dimension = dimension
        def describe(self, image):
            image = cv2.resize(image, self.dimension, interpolation=cv2.INTER_CUBIC)
            # image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
            return image
    • 图片搜索匹配内核Searcher。

      1. 类成员colorIndexPathstructureIndexPath。记录色彩空间特征索引表路径和结构特征索引表路径。
      2. 成员函数solveColorDistance(self, features, queryFeatures, eps = 1e-5)。求featuresqueryFeatures特征向量的二范数eps是为了避免除零错误
      3. 成员函数solveStructureDistance(self, structures, queryStructures, eps = 1e-5)。同样是求特征向量的二范数eps是为了避免除零错误。需作统一化处理,color和structure特征向量距离相对比例适中,不可过分偏颇。
      4. 成员函数searchByColor(self, queryFeatures)。使用csv模块的reader方法读入索引表数据。采用re的split方法解析数据格式。用字典searchResults存储query图像与库中图像的距离,键为图库内图像名imageName,值为距离distance
      5. 成员函数transformRawQuery(self, rawQueryStructures)。将未处理的query图像矩阵转为用于匹配的特征向量形式
      6. 成员函数searchByStructure(self, rawQueryStructures)。类似4。
      7. 成员函数search(self, queryFeatures, rawQueryStructures, limit = 3)。将searchByColor方法和searchByStructure的结果汇总,获得总匹配分值,分值越低代表综合距离越小,匹配程度越高。返回前limit个最佳匹配图像。
    class Searcher:
        __slot__ = ["colorIndexPath", "structureIndexPath"]
        def __init__(self, colorIndexPath, structureIndexPath):
            self.colorIndexPath, self.structureIndexPath = colorIndexPath, structureIndexPath
        def solveColorDistance(self, features, queryFeatures, eps = 1e-5):
            distance = 0.5 * numpy.sum([((a - b) ** 2) / (a + b + eps) for a, b in zip(features, queryFeatures)])
            return distance
        def solveStructureDistance(self, structures, queryStructures, eps = 1e-5):
            distance = 0
            normalizeRatio = 5e3
            for index in xrange(len(queryStructures)):
                for subIndex in xrange(len(queryStructures[index])):
                    a = structures[index][subIndex]
                    b = queryStructures[index][subIndex]
                    distance += (a - b) ** 2 / (a + b + eps)
            return distance / normalizeRatio
        def searchByColor(self, queryFeatures):
            searchResults = {}
            with open(self.colorIndexPath) as indexFile:
                reader = csv.reader(indexFile)
                for line in reader:
                    features = []
                    for feature in line[1:]:
                        feature = feature.replace("[", "").replace("]", "")
                        findStartPosition = 0
                        feature = re.split("\s+", feature)
                        rmlist = []
                        for index, strValue in enumerate(feature):
                            if strValue == "":
                                rmlist.append(index)
                        for _ in xrange(len(rmlist)):
                            currentIndex = rmlist[-1]
                            rmlist.pop()
                            del feature[currentIndex]
                        feature = [float(eachValue) for eachValue in feature]
                        features.append(feature)
                    distance = self.solveColorDistance(features, queryFeatures)
                    searchResults[line[0]] = distance
                indexFile.close()
            # print "feature", sorted(searchResults.iteritems(), key = lambda item: item[1], reverse = False)
            return searchResults
        def transformRawQuery(self, rawQueryStructures):
            queryStructures = []
            for substructure in rawQueryStructures:
                structure = []
                for line in substructure:
                    for tripleColor in line:
                        structure.append(float(tripleColor))
                queryStructures.append(structure)
            return queryStructures
        def searchByStructure(self, rawQueryStructures):
            searchResults = {}
            queryStructures = self.transformRawQuery(rawQueryStructures)
            with open(self.structureIndexPath) as indexFile:
                reader = csv.reader(indexFile)
                for line in reader:
                    structures = []
                    for structure in line[1:]:
                        structure = structure.replace("[", "").replace("]", "")
                        structure = re.split("\s+", structure)
                        if structure[0] == "":
                            structure = structure[1:]
                        structure = [float(eachValue) for eachValue in structure]
                        structures.append(structure)
                    distance = self.solveStructureDistance(structures, queryStructures)
                    searchResults[line[0]] = distance
                indexFile.close()
            # print "structure", sorted(searchResults.iteritems(), key = lambda item: item[1], reverse = False)
            return searchResults
        def search(self, queryFeatures, rawQueryStructures, limit = 3):
            featureResults = self.searchByColor(queryFeatures)
            structureResults = self.searchByStructure(rawQueryStructures)
            results = {}
            for key, value in featureResults.iteritems():
                results[key] = value + structureResults[key]
            results = sorted(results.iteritems(), key = lambda item: item[1], reverse = False)
            return results[ : limit]
    • 图像索引表构建驱动index.py。

    • 引入color_descriptorstructure_descriptor。用于解析图片库图像,获得色彩空间特征向量和构图空间特征向量。

    • argparse设置命令行参数。参数包括图片库路径、色彩空间特征索引表路径、构图空间特征索引表路径。
    • glob获得图片库路径。
    • 生成索引表文本并写入csv文件。
    • 可采用如下命令行形式启动驱动程序。
    python index.py --dataset dataset --colorindex color——index.csv --structure structure_index.csv

    dataset为图片库路径。color_index.csv为色彩空间特征索引表路径。structure_index.csv为构图空间特征索引表路径。

    import color_descriptor
    import structure_descriptor
    import glob
    import argparse
    import cv2
    
    searchArgParser = argparse.ArgumentParser()
    searchArgParser.add_argument("-d", "--dataset", required = True, help = "Path to the directory that contains the images to be indexed")
    searchArgParser.add_argument("-c", "--colorindex", required = True, help = "Path to where the computed color index will be stored")
    searchArgParser.add_argument("-s", "--structureindex", required = True, help = "Path to where the computed structure index will be stored")
    arguments = vars(searchArgParser.parse_args())
    
    idealBins = (8, 12, 3)
    colorDesriptor = color_descriptor.ColorDescriptor(idealBins)
    
    output = open(arguments["colorindex"], "w")
    
    for imagePath in glob.glob(arguments["dataset"] + "/*.jpg"):
        imageName = imagePath[imagePath.rfind("/") + 1 : ]
        image = cv2.imread(imagePath)
        features = colorDesriptor.describe(image)
        # write features to file
        features = [str(feature).replace("\n", "") for feature in features]
        output.write("%s,%s\n" % (imageName, ",".join(features)))
    # close index file
    output.close()
    
    idealDimension = (16, 16)
    structureDescriptor = structure_descriptor.StructureDescriptor(idealDimension)
    
    output = open(arguments["structureindex"], "w")
    
    for imagePath in glob.glob("dataset" + "/*.jpg"):
        imageName = imagePath[imagePath.rfind("/") + 1 : ]
        image = cv2.imread(imagePath)
        structures = structureDescriptor.describe(image)
        # write structures to file
        structures = [str(structure).replace("\n", "") for structure in structures]
        output.write("%s,%s\n" % (imageName, ",".join(structures)))
    # close index file
    output.close()
    
    • 图像搜索引擎驱动searchEngine.py。

    • 引入color_descriptorstructure_descriptor。用于解析待匹配(搜索)的图像,获得色彩空间特征向量和构图空间特征向量。

    • argparse设置命令行参数。参数包括图片库路径、色彩空间特征索引表路径、构图空间特征索引表路径、待搜索图片路径。
    • 生成索引表文本并写入csv文件。
    • 可采用如下命令行形式启动驱动程序。
    python searchEngine.py -c color_index.csv -s structure_index.csv -r dataset -q query/pyramid.jpg 

    dataset为图片库路径。color_index.csv为色彩空间特征索引表路径。structure_index.csv为构图空间特征索引表路径,query/pyramid.jpg为待搜索图片路径。

    searchArgParser = argparse.ArgumentParser()
    searchArgParser.add_argument("-c", "--colorindex", required = True, help = "Path to where the computed color index will be stored")
    searchArgParser.add_argument("-s", "--structureindex", required = True, help = "Path to where the computed structure index will be stored")
    searchArgParser.add_argument("-q", "--query", required = True, help = "Path to the query image")
    searchArgParser.add_argument("-r", "--resultpath", required = True, help = "Path to the result path")
    searchArguments = vars(searchArgParser.parse_args())
    
    idealBins = (8, 12, 3)
    idealDimension = (16, 16)
    
    colorDescriptor = color_descriptor.ColorDescriptor(idealBins)
    structureDescriptor = structure_descriptor.StructureDescriptor(idealDimension)
    queryImage = cv2.imread(searchArguments["query"])
    colorIndexPath = searchArguments["colorindex"]
    structureIndexPath = searchArguments["structureindex"]
    resultPath = searchArguments["resultpath"]
    
    queryFeatures = colorDescriptor.describe(queryImage)
    queryStructures = structureDescriptor.describe(queryImage)
    
    imageSearcher = searcher.Searcher(colorIndexPath, structureIndexPath)
    searchResults = imageSearcher.search(queryFeatures, queryStructures)
    
    for imageName, score in searchResults:
        queryResult = cv2.imread(resultPath + "/" + imageName)
        cv2.imshow("Result Score: " + str(int(score)) + " (lower is better)", queryResult)
        cv2.waitKey(0)
    
    cv2.imshow("Query", queryImage)
    cv2.waitKey(0)

    3. 搜索引擎测试

    Qeury: fish.jpg

    fish

    Result(匹配分值越低越好):

    1. Score: 0
      fish
    2. Score: 17
      fish
    3. Score: 21
      fish

    Qeury: forest.jpg

    forest

    Result(匹配分值越低越好):

    1. Score: 0
      forest
    2. Score: 33
      forest
    3. Score: 33
      forest

    Qeury: trip.jpg

    trip

    Result(匹配分值越低越好):

    1. Score: 0
      trip
    2. Score: 23
      trip
    3. Score: 24
      trip

    Qeury: zebra.jpg

    zebra

    Result(匹配分值越低越好):

    1. Score: 0
      zebra
    2. Score: 23
      zebra
    3. Score: 25
      zebra

    总结:总能搜索到完全一致的图像(即原图)。搜索得到的图像与原图基本符合。测试成功。如分析有误或代码出错,请批评指正。谢谢。

    4. Python源代码

    color_descriptor.py

    import cv2
    import numpy
    
    class ColorDescriptor:
        __slot__ = ["bins"]
        def __init__(self, bins):
            self.bins = bins
        def getHistogram(self, image, mask, isCenter):
            # get histogram
            imageHistogram = cv2.calcHist([image], [0, 1, 2], mask, self.bins, [0, 180, 0, 256, 0, 256])
            # normalize
            imageHistogram = cv2.normalize(imageHistogram, imageHistogram).flatten()
            if isCenter:
                weight = 5.0
                for index in xrange(len(imageHistogram)):
                    imageHistogram[index] *= weight
            return imageHistogram
        def describe(self, image):
            image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
            features = []
            # get dimension and center
            height, width = image.shape[0], image.shape[1]
            centerX, centerY = int(width * 0.5), int(height * 0.5)
            # initialize mask dimension
            segments = [(0, centerX, 0, centerY), (0, centerX, centerY, height), (centerX, width, 0, centerY), (centerX, width, centerY, height)]
            # initialize center part
            axesX, axesY = int(width * 0.75) / 2, int (height * 0.75) / 2
            ellipseMask = numpy.zeros([height, width], dtype="uint8")
            cv2.ellipse(ellipseMask, (centerX, centerY), (axesX, axesY), 0, 0, 360, 255, -1)
            # initialize corner part
            for startX, endX, startY, endY in segments:
                cornerMask = numpy.zeros([height, width], dtype="uint8")
                cv2.rectangle(cornerMask, (startX, startY), (endX, endY), 255, -1)
                cornerMask = cv2.subtract(cornerMask, ellipseMask)
                # get histogram of corner part
                imageHistogram = self.getHistogram(image, cornerMask, False)
                features.append(imageHistogram)
            # get histogram of center part
            imageHistogram = self.getHistogram(image, ellipseMask, True)
            features.append(imageHistogram)
            # return
            return features

    structure_descriptor.py

    import cv2
    
    class StructureDescriptor:
        __slot__ = ["dimension"]
        def __init__(self, dimension):
            self.dimension = dimension
        def describe(self, image):
            image = cv2.resize(image, self.dimension, interpolation=cv2.INTER_CUBIC)
            # image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
            return image
    

    searcher.py

    import numpy
    import csv
    import re
    
    class Searcher:
        __slot__ = ["colorIndexPath", "structureIndexPath"]
        def __init__(self, colorIndexPath, structureIndexPath):
            self.colorIndexPath, self.structureIndexPath = colorIndexPath, structureIndexPath
        def solveColorDistance(self, features, queryFeatures, eps = 1e-5):
            distance = 0.5 * numpy.sum([((a - b) ** 2) / (a + b + eps) for a, b in zip(features, queryFeatures)])
            return distance
        def solveStructureDistance(self, structures, queryStructures, eps = 1e-5):
            distance = 0
            normalizeRatio = 5e3
            for index in xrange(len(queryStructures)):
                for subIndex in xrange(len(queryStructures[index])):
                    a = structures[index][subIndex]
                    b = queryStructures[index][subIndex]
                    distance += (a - b) ** 2 / (a + b + eps)
            return distance / normalizeRatio
        def searchByColor(self, queryFeatures):
            searchResults = {}
            with open(self.colorIndexPath) as indexFile:
                reader = csv.reader(indexFile)
                for line in reader:
                    features = []
                    for feature in line[1:]:
                        feature = feature.replace("[", "").replace("]", "")
                        findStartPosition = 0
                        feature = re.split("\s+", feature)
                        rmlist = []
                        for index, strValue in enumerate(feature):
                            if strValue == "":
                                rmlist.append(index)
                        for _ in xrange(len(rmlist)):
                            currentIndex = rmlist[-1]
                            rmlist.pop()
                            del feature[currentIndex]
                        feature = [float(eachValue) for eachValue in feature]
                        features.append(feature)
                    distance = self.solveColorDistance(features, queryFeatures)
                    searchResults[line[0]] = distance
                indexFile.close()
            # print "feature", sorted(searchResults.iteritems(), key = lambda item: item[1], reverse = False)
            return searchResults
        def transformRawQuery(self, rawQueryStructures):
            queryStructures = []
            for substructure in rawQueryStructures:
                structure = []
                for line in substructure:
                    for tripleColor in line:
                        structure.append(float(tripleColor))
                queryStructures.append(structure)
            return queryStructures
        def searchByStructure(self, rawQueryStructures):
            searchResults = {}
            queryStructures = self.transformRawQuery(rawQueryStructures)
            with open(self.structureIndexPath) as indexFile:
                reader = csv.reader(indexFile)
                for line in reader:
                    structures = []
                    for structure in line[1:]:
                        structure = structure.replace("[", "").replace("]", "")
                        structure = re.split("\s+", structure)
                        if structure[0] == "":
                            structure = structure[1:]
                        structure = [float(eachValue) for eachValue in structure]
                        structures.append(structure)
                    distance = self.solveStructureDistance(structures, queryStructures)
                    searchResults[line[0]] = distance
                indexFile.close()
            # print "structure", sorted(searchResults.iteritems(), key = lambda item: item[1], reverse = False)
            return searchResults
        def search(self, queryFeatures, rawQueryStructures, limit = 3):
            featureResults = self.searchByColor(queryFeatures)
            structureResults = self.searchByStructure(rawQueryStructures)
            results = {}
            for key, value in featureResults.iteritems():
                results[key] = value + structureResults[key]
            results = sorted(results.iteritems(), key = lambda item: item[1], reverse = False)
            return results[ : limit]
    

    index.py

    import color_descriptor
    import structure_descriptor
    import glob
    import argparse
    import cv2
    
    searchArgParser = argparse.ArgumentParser()
    searchArgParser.add_argument("-d", "--dataset", required = True, help = "Path to the directory that contains the images to be indexed")
    searchArgParser.add_argument("-c", "--colorindex", required = True, help = "Path to where the computed color index will be stored")
    searchArgParser.add_argument("-s", "--structureindex", required = True, help = "Path to where the computed structure index will be stored")
    arguments = vars(searchArgParser.parse_args())
    
    idealBins = (8, 12, 3)
    colorDesriptor = color_descriptor.ColorDescriptor(idealBins)
    
    output = open(arguments["colorindex"], "w")
    
    for imagePath in glob.glob(arguments["dataset"] + "/*.jpg"):
        imageName = imagePath[imagePath.rfind("/") + 1 : ]
        image = cv2.imread(imagePath)
        features = colorDesriptor.describe(image)
        # write features to file
        features = [str(feature).replace("\n", "") for feature in features]
        output.write("%s,%s\n" % (imageName, ",".join(features)))
    # close index file
    output.close()
    
    idealDimension = (16, 16)
    structureDescriptor = structure_descriptor.StructureDescriptor(idealDimension)
    
    output = open(arguments["structureindex"], "w")
    
    for imagePath in glob.glob("dataset" + "/*.jpg"):
        imageName = imagePath[imagePath.rfind("/") + 1 : ]
        image = cv2.imread(imagePath)
        structures = structureDescriptor.describe(image)
        # write structures to file
        structures = [str(structure).replace("\n", "") for structure in structures]
        output.write("%s,%s\n" % (imageName, ",".join(structures)))
    # close index file
    output.close()
    

    searchEngine.py

    import color_descriptor
    import structure_descriptor
    import searcher
    import argparse
    import cv2
    
    searchArgParser = argparse.ArgumentParser()
    searchArgParser.add_argument("-c", "--colorindex", required = True, help = "Path to where the computed color index will be stored")
    searchArgParser.add_argument("-s", "--structureindex", required = True, help = "Path to where the computed structure index will be stored")
    searchArgParser.add_argument("-q", "--query", required = True, help = "Path to the query image")
    searchArgParser.add_argument("-r", "--resultpath", required = True, help = "Path to the result path")
    searchArguments = vars(searchArgParser.parse_args())
    
    idealBins = (8, 12, 3)
    idealDimension = (16, 16)
    
    colorDescriptor = color_descriptor.ColorDescriptor(idealBins)
    structureDescriptor = structure_descriptor.StructureDescriptor(idealDimension)
    queryImage = cv2.imread(searchArguments["query"])
    colorIndexPath = searchArguments["colorindex"]
    structureIndexPath = searchArguments["structureindex"]
    resultPath = searchArguments["resultpath"]
    
    queryFeatures = colorDescriptor.describe(queryImage)
    queryStructures = structureDescriptor.describe(queryImage)
    
    imageSearcher = searcher.Searcher(colorIndexPath, structureIndexPath)
    searchResults = imageSearcher.search(queryFeatures, queryStructures)
    
    for imageName, score in searchResults:
        queryResult = cv2.imread(resultPath + "/" + imageName)
        cv2.imshow("Result Score: " + str(int(score)) + " (lower is better)", queryResult)
        cv2.waitKey(0)
    
    cv2.imshow("Query", queryImage)
    cv2.waitKey(0)
    

    searchEngineTest.py

    import cv2
    import glob
    import csv
    import re
    import numpy
    import structure_descriptor
    
    idealDimension = (16, 16)
    structureDescriptor = structure_descriptor.StructureDescriptor(idealDimension)
    
    testImage = cv2.imread("query/forest.jpg")
    rawQueryStructures = structureDescriptor.describe(testImage)
    
    # index
    output = open("structureIndex.csv", "w")
    
    for imagePath in glob.glob("dataset" + "/*.jpg"):
        imageName = imagePath[imagePath.rfind("/") + 1 : ]
        image = cv2.imread(imagePath)
        structures = structureDescriptor.describe(image)
        # write structures to file
        structures = [str(structure).replace("\n", "") for structure in structures]
        output.write("%s,%s\n" % (imageName, ",".join(structures)))
    # close index file
    output.close()
    
    # searcher
    
    def solveStructureDistance(self, structures, queryStructures, eps = 1e-5):
        distance = 0
        for index in xrange(len(queryFeatures)):
            for subIndex in xrange(len(queryFeatures[index])):
                a = features[index][subIndex]
                b = queryFeatures[index][subIndex]
                distance += (a - b) ** 2 / (a + b + eps)
        return distance / 5e3
    
    queryStructures = []
    for substructure in rawQueryStructures:
        structure = []
        for line in substructure:
            for tripleColor in line:
                structure.append(float(tripleColor))
        queryStructures.append(structure)
    searchResults = {}
    with open("structureIndex.csv") as indexFile:
        reader = csv.reader(indexFile)
        for line in reader:
            structures = []
            for structure in line[1:]:
                structure = structure.replace("[", "").replace("]", "")
                structure = re.split("\s+", structure)
                if structure[0] == "":
                    structure = structure[1:]
                structure = [float(eachValue) for eachValue in structure]
                print len(structure)
                structures.append(structure)
            distance = solveDistance(structures, queryStructures)
            searchResults[line[0]] = distance
        indexFile.close()
    searchResults = sorted(searchResults.iteritems(), key=lambda item: item[1], reverse=False)
    
    print searchResults
    
    展开全文
  • 1.python爬取百度图片原图

    千次阅读 2018-01-09 14:29:45
    尝试了几个网上的爬虫示例,改编了一下,可以爬取百度图片的原图,示例:Python3.6.0,Win7环境,chrome浏览器,命令行cmd需要用管理员身份运行,完整代码如下: 注意:图片下载路径,是浏览器的默认下载路径,可以...
    尝试了几个网上的爬虫示例,改编了一下,可以爬取百度图片的原图,示例:Python3.6.0,Win7环境,chrome浏览器,命令行cmd需要用管理员身份运行,完整代码如下:
    
    注意:图片下载路径,是浏览器的默认下载路径,可以自行更改


    #coding=gbk
    import time
    from splinter import Browser
    import traceback
    
    class Crawler:
        def __init__(self):
            #url,是百度图片搜索的路径,我这里搜索的是“仙剑”
            self.url="https://image.baidu.com/search/detail?ct=503316480&z=0&ipn=d&word=%E4%BB%99%E5%89%91&step_word=&hs=0&pn=0&spn=0&di=148219565890&pi=0&rn=1&tn=baiduimagedetail&is=0%2C0&istype=2&ie=utf-8&oe=utf-8&in=&cl=2&lm=-1&st=-1&cs=618397702%2C431402105&os=1428570058%2C3622471812&simid=0%2C0&adpicid=0&lpn=0&ln=1975&fr=&fmq=1514960095280_R&fm=index&ic=0&s=undefined&se=&sme=&tab=0&width=&height=&face=undefined&ist=&jit=&cg=&bdtype=0&oriquery=&objurl=http%3A%2F%2Ff5.topit.me%2F5%2F83%2F1c%2F11450884282a91c835o.jpg&fromurl=ippr_z2C%24qAzdH3FAzdH3Fooo_z%26e3Bp5rtp_z%26e3B4jAzdH3Ftpj4AzdH3F8c0ca9l9&gsm=0&rpstart=0&rpnum=0"
    
    
        def launch(self):
            #启动驱动程序
    
            browser = Browser('chrome')
            browser.driver.maximize_window()
            browser.visit(self.url)
    
            #range(100)是从0到100,下载100张图片
            for i in range(100):
                try:
                    browser.reload()
                    #timeout(30)是间隔时间,可以自己调节
                    browser.driver.set_page_load_timeout(30)
                    browser.driver.set_script_timeout(30)
                    if browser.is_element_present_by_text('下载'):
                        browser.find_by_text('下载').first.click()
                        time.sleep(1)
                        browser.evaluate_script('$(".img-switch-btn").last().click()')
                        print(i)
                    else:
                        pass
                        print('0')
                except:
                    try:
                        browser.evaluate_script('$(".img-switch-btn").last().click()')
                    except:
                        traceback.print_exc()
                        pass
    
    if __name__ == '__main__':
        crawler = Crawler()
        crawler.launch()
    
    


    展开全文
  • 相似图片搜索算法介绍

    万次阅读 2017-08-21 15:16:14
    相似图片搜索算法介绍

    前言

    之前对图片聚类有一丢丢的研究,最近发现,使用一些相似图片搜索算法也可以实现图片聚类的目标:将同类别或差不多的图片聚在一起。所以整理出相似图片搜索算法介绍这篇文章,主要介绍AutoEncoder、based CNN、Hash等算法,细分又包括:AutoEncoder、Siamese Network、2-channel、Central-surround two-stream network、aHash、pHash、dHash等算法。

    AutoEncoder

    AE作为一种无监督算法,通过encode和decode两个过程实现,当encode和decode过程均为一层时,AE很类似PCA;多层时,又有些类似神经网络。

    如上图所示,code左侧的为encode层,右侧为decode层,目的是使得输入的x和输出的x_head越接近越好,所以在误差反向传播时需要优化x和x_head的差异值。通过encode和decode两个过程,AE可以提取图片特征,不断的训练之后就可以通过得到的特征参数对相似图片进行搜索。AutoEncoder详细介绍 点击这里
    我的 一篇文章实现了AutoEncoder对MNIST数据集的特征提取; 另一篇文章实现了AutoEncoder对相似图片的搜索。

    Based CNN

    这个板块中的算法来自 这篇论文,主要介绍了Siamese Network、2-channel、Central-surround two-stream network、SSP几种算法,并对比他们之间的联系和区别。

    Siamese Network

    这个算法最初用于手写签字的识别,之后又应用在相似图片的处理上面,如下图所示,patch1和patch2为输入图片,两张图片分别经过卷积层(包括卷积、ReLU、最大池化等过程),得到两个特征向量,接着进入黄色的全连接层,最后输出两个图片的相似度。在Siamese Network算法中,两个patch在卷积层中的权值共享。
    论文中有对Siamese Network算法进行改进,变为Pseudo-siamese算法,这个算法与Siamese Network的区别为:卷积层中的权值不共享,在下图中间部分可以看到。

    2-channel

    channel这个词最先是在图片灰度上面提到的,像MNIST数据集,图片都是黑白的,channel为1,彩色图片channel为3,分为R、G、B三个channel,顾名思义,这个算法就是由两个channel组成,这两个channel就是要比较的两张图片,如下图所示,与上面Siamese Network算法的不同之处在于,这个算法合并了上面的两个卷积层,使两张图片编程一张,举个例子,有两张(1,32,32)的黑白图片,放在这个算法中,就相当于是对卷积层输入一个(2,32,32)的图片,然后在经过一层全连接,输出一个值,这个输出的值就表示两张图片的差异。

    Central-surround two-stream network

    这个算法在2-channel的基础上进行了改进,对比上下两张图,如果不考虑右侧蓝色块,仅考虑左侧的结构,和2-channel是一样的,这个算法的改进之处在于:
    首先,左侧输入的图片不再是原图,而是经过了处理,如图所示,经过了下采样,使得图像变小,Paper中介绍的原图patch大小为64*64,那么在左侧的输入为32*32。其次,右侧的输入图片为原始图片的中心部分,大小也是32*32,这样一来,左右两侧的输入图片大小相等。

    SSP

    我们平时的输入图片多为32*32、64*64、128*128这种,图片的长和宽都是确定的,如果原始图片的长和宽不确定,我们使用前需要进行预处理,这样就影响了图片的精度,SSP算法就是为了解决这个问题。

    Hash Method

    Hash算法作为大多图片搜索引擎的核心算法,其准确率和效率均很高,本板块将介绍Hash的三种核心算法:aHash、pHash、dHash。

    aHash

    此算法是基于比较灰度图每个像素与平均值来实现的。
    步骤:
    1.缩放图片:为了保留结构去掉细节,去除大小、横纵比的差异,把图片统一缩放到8*8,共64个像素的图片。
    2.转化为灰度图:把缩放后的图片转化为256阶的灰度图。
    3.计算平均值: 计算进行灰度处理后图片的所有像素点的平均值。
    4.比较像素灰度值:遍历灰度图片每一个像素,如果大于平均值记录为1,否则为0.
    5.得到信息指纹:组合64个bit位,顺序随意保持一致性即可。
    6.对比指纹:计算两幅图片的指纹,计算汉明距离(从一个指纹到另一个指纹需要变几次),汉明距离越大则说明图片越不一致,反之,汉明距离越小则说明图片越相似,当距离为0时,说明完全相同。(通常认为距离>10 就是两张完全不同的图片)

    pHash

    平均哈希算法过于严格,不够精确,更适合搜索缩略图,为了获得更精确的结果可以选择感知哈希算法,它采用的是DCT(离散余弦变换)来降低频率的方法
    步骤:
    1.缩小图片:32 * 32是一个较好的大小,这样方便DCT计算
    2.转化为灰度图:把缩放后的图片转化为256阶的灰度图。(具体算法见平均哈希算法步骤)
    3.计算DCT:DCT把图片分离成分率的集合
    4.缩小DCT:DCT是32*32,保留左上角的8*8,这些代表的图片的最低频率
    5.计算平均值:计算缩小DCT后的所有像素点的平均值。
    6.进一步减小DCT:大于平均值记录为1,反之记录为0.
    7.得到信息指纹:组合64个信息位,顺序随意保持一致性即可。
    8.对比指纹:计算两幅图片的指纹,计算汉明距离(从一个指纹到另一个指纹需要变几次),汉明距离越大则说明图片越不一致,反之,汉明距离越小则说明图片越相似,当距离为0时,说明完全相同。(通常认为距离>10 就是两张完全不同的图片)

    dHash

    相比pHash,dHash的速度要快的多,相比aHash,dHash在效率几乎相同的情况下的效果要更好,它是基于渐变实现的。
    步骤:
    1.缩小图片:收缩到9*8的大小,一遍它有72的像素点
    2.转化为灰度图:把缩放后的图片转化为256阶的灰度图。(具体算法见平均哈希算法步骤)
    3.计算差异值:dHash算法工作在相邻像素之间,这样每行9个像素之间产生了8个不同的差异,一共8行,则产生了64个差异值
    4.获得指纹:如果左边的像素比右边的更亮,则记录为1,否则为0.

    参考资料

    展开全文
  • 图搜索算法

    千次阅读 2018-05-05 13:27:44
    本文作者: lemon ... 版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 3.0 许可协议。...所谓的G=(V,E)G=(V,E),由顶点(Vertex) VV 和边(Edges) EE 组成。可以用两种标准方式来表示: 邻接...
  • vue高德地图搜索功能

    千次阅读 2019-02-15 11:31:23
    官方的 Demo 中使用了AMap.AutoComplete,本次根据实际项目需求去掉了,结合了带列表的POI搜索的这个 Demo ,再将监听事件改为列表点选的selectChange事件,获得当前点选地点经纬度,这样将二者进行了组合一下...
  • 网上爬取百度图片的五花八门,要么有的过时的,有的则是爬取的是缩略图,不是原图等。 鉴于此在学习的过程中,记录此贴。在写本文的时候,代码是可用的。 前言 1.首先要有第一个明白的地方是百度图片目前是动态页面...
  • 扫描图片按原图尺寸打印的方法

    千次阅读 2017-11-08 14:15:00
    用户说需要按原稿尺寸打印一张图片,网上搜索了下,找到这篇好文: http://hi.baidu.com/wurenhecai/blog/item/3f25fadc898969a4cd1166c3.html 题记:已发表在《电脑迷》,勿商业转载和抄袭,个人转载请声明出处,...
  • 如何在Google上下载高清原图

    千次阅读 2019-10-03 06:03:08
    当然有强迫症的人就会说:我一定要下载原图,那么请接着往下看。   二、 1.通过火狐浏览器访问Google,并搜索相关图片,会有如下页面:   2.然后将自己想要下载的图片给点击开,这里我随便点击一张图: ...
  • 告诉您是可以把图片保存起来的哦,更可以用到自己的京东店铺上去的,可您们知道京东商品主图怎么保存到原图的吗?如果各位京东商家们不知道应该怎么做,那么小编就来一一教大家怎样正确的保存方法。 一.首先需要安装...
  • python爬虫----图片爬取之高清原图

    万次阅读 多人点赞 2017-07-25 11:21:05
    这次又来爬取图片啦,不过这次爬的是原图 大概的思路和上一篇差不多,不同的是不同的网站有不同的反爬策略 爬取的网站是:https://www.pexels.com/ 1、源码分析 进入网站后会出现一个图片搜索关键词的界面,...
  • 十大相似图片搜索网站(以搜图)

    千次阅读 2015-03-23 11:52:03
    下面的搜索引擎可以帮你实现、以、以搜图。 以搜图是颠覆性的搜索方式,基于图片的搜索模式自09年以来在全球各大权威评选中,都被公认为未来几年互联网最有前途的创新应用。随着互联网信息的急剧膨胀,...
  • 你想凭着一张现有图片找出它的原始图片,或者是凭着一张小...Tineye是典型的以图找图搜索引擎,输入本地硬盘上的图片或者输入图片网址,即可自动帮你搜索相似图片,搜索准确度相对来说还比较令人满意。   TinEye
  • 介绍python的安装和使用,使用Python 3的版本,爬取百度图片的高清原图,可以自定义搜索内容和下载路径,并分享全代码,注释清晰,简单容易上手。
  • OpenCV实现图片搜索引擎

    千次阅读 2018-06-23 14:29:45
    OpenCV(Open Source Computer Vision Library)的计算效率很高且能够完成实时任务。OpenCV库由优化的C/C++代码编写而成,能够充分...0.Python+OpenCV实现图像搜索引擎之前看到谷歌和百度出了图像搜索引擎,查阅了相...
  • 寻找百度图片搜索接口--two

    千次阅读 2016-03-11 20:31:50
    这里我继续看了开发者工具,console控制台有一条错误信息,如: 这个信息很是重要的,但是这时我还没有意识到! 于是我继续搜寻,我是这样想的,如果那里没有显示出来,肯定是它后来加载进去的,也就是应该解析...
  • 路径规划基本介绍(一)

    万次阅读 多人点赞 2019-04-24 21:30:03
    一、路径规划的作用 路径规划主要是让目标对象在规定范围内的区域内找到一条从起点到终点的无碰撞安全路径。路径规划中有静态路径规划以及动态路径规划。...搜索方法 二、路径规划需要考虑的几个方面 1.起...
  • Python算法之深度优先搜索

    千次阅读 2019-04-13 10:04:43
    是一种用于遍历或搜索树或的算法。沿着树的深度遍历树的节点,尽可能深的搜索树的分支。当节点v的所在边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点。这一过程一直进行到已发现从源节点可达的所有节点...
  • BM3D图像去噪算法原理及代码详解

    万次阅读 多人点赞 2019-11-19 23:22:56
    1. BM3D 算法简介 BM3D是2007年TIP的文章,题目是Image denoising by sparse 3D transform-domain collaborative ltering,论文、项目的... 处理灰度的BM3D以及它的变体CBM3D(彩色)、VBM3D(时域)是图像去噪...
  • 搜索技巧
  • 原生js 实现到搜索的下拉框

    千次阅读 2018-11-02 10:19:59
    1 介绍 在实现下拉框的时候,如果用select+...1 利用一个input充当搜索框,div+p充当下拉框放置于input的下方。如所示: 2 接下来就是js的实现了,我们先把红色区域的div+p利用display:none隐藏起来。 对表单in...
  • 图片搜索引擎大合集

    万次阅读 2012-05-21 23:51:05
    相似图片搜索网站(以搜图) ...如何凭着一张现有图片找出它的原始图片,或者是凭着一张小的...以搜图是颠覆性的搜索方式,基于图片的搜索模式自09年以来在全球各大权威评选中,都被公认为未来几年互联网最有前
  • 浏览器扩展插件:「油猴」使用详解 ( Tampermonkey )

    万次阅读 多人点赞 2019-09-03 18:11:47
    完全去除扰眼和各类广告模块,全面精简并美化各种贴吧页面,去除贴吧帖子里链接的跳转,按发帖时间排序,查看贴吧用户发言记录,贴子关键字屏蔽,移除会员彩名,直接在当前页面查看原图,可缩放,可多开,可拖拽 ...
  • 经遍历而确定的边类型中,最重要的一类即所谓的树边,它们与所有顶点共同构成了原图的一棵支撑树(森林),称作遍历树(traversal tree)。     广度优先搜索(BFS) 广度优先搜索(breadth-first search, BFS)采用的...
  • 图片搜索网站大全

    千次阅读 2016-07-09 19:02:54
    你想凭着一张现有图片找...Tineye是典型的以图找图搜索引擎,输入本地硬盘上的图片或者输入图片网址,即可自动帮你搜索相似图片,搜索准确度相对来说还比较令人满意。 TinEye是加拿大Idée公司研发的相似图片搜索引擎,
  • 几天看到阮一峰的博客里写到关于相似图片搜索的原理, 里面介绍了Google相似图片搜索的大致原理,主要是从Neal Krawetz博士的LOOKS LIKE IT翻译而来。文章详细的介绍了相似图片搜索处理的相关步骤,并且给出了一个...
  • 相似图片搜索原理一(ahash—c++实现)

    千次阅读 2015-04-17 20:45:25
    ahash,全称叫做average hash...主要用于由图像的缩略图搜原图,对于图像的旋转、平移、对比度和微变形等都无能为力,所以很局限。此次讲解主要分为两个部分,理论部分主要参考是网上的资料,最核心的应该是自己的c++代
  • 马上就要考研咯,今天还是作死研究安装了下黑苹果,罪恶感啊 言归正传,接下来将献上我的黑苹果教程 首先呢第一步下载你所需要的macOS系统,... (1)macOS High Sierra 10.13.6(17G65) Clover 2.4k r4596黑苹果...
  • 寻找百度图片搜索接口历程--one

    千次阅读 2016-03-11 19:45:59
    最近自己在做个网站,主要是想展示一些车辆的信息,车辆的文字信息抓的差不多了,但是车辆的图片信息还差好多,尤其是好看又清晰一些的图片,然后我就想到用百度的图片搜索来为自己抓取一些图片! 首先说下我想的...
  • -----------------转载自yclzh0522的博客-------------------------- 你想凭着一张现有图片找出它的原始图片,或者是凭着一张小的缩略图找出...Tineye是典型的以图找图搜索引擎,输入本地硬盘上的图片或者输入图片网址

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 248,043
精华内容 99,217
关键字:

原图搜索