在学习时:http://python.jobbole.com/80860/

在这里对上面给出的链接中的代码进行整理和修改了下,图像搜索的原理,以及搜索的大致步骤和想法,在原博主文章中已经讲解的很详细了,在这里我就不写了,对于上面链接中的代码,有些地方是需要改动的

先贴出我的代码:

直接上代码:

color_descriptor.py

# -*- coding: utf-8 -*-
# !/usr/bin/env python
# @Time    : 2018/11/6 15:17
# @Author  : xhh
# @Desc    : 颜色空间特征提取器
# @File    : color_descriptor.py
# @Software: PyCharm
import cv2
import numpyclass ColorDescriptor:__slot__ = ["bins"]def __init__(self, bins):self.bins = bins# 得到图片的色彩直方图,mask为图像处理区域的掩模def getHistogram(self, image, mask, isCenter):# 利用OpenCV中的calcHist得到图片的直方图imageHistogram = cv2.calcHist([image], [0, 1, 2], mask, self.bins, [0, 180, 0, 256, 0, 256])# 标准化(归一化)直方图normalizeimageHistogram = cv2.normalize(imageHistogram, imageHistogram).flatten()# isCenter判断是否为中间点,对色彩特征向量进行加权处理if isCenter:weight = 5.0  # 权重记为0.5for index in range(len(imageHistogram)):imageHistogram[index] *= weightreturn imageHistogram# 将图像从BGR色彩空间转换为HSV色彩空间def describe(self, image):image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)features = []# 获取图片的中心点和图片的大小height, width = image.shape[0], image.shape[1]centerX, centerY = int(width * 0.5), int(height * 0.5)# initialize mask dimension# 生成左上、右上、左下、右下、中心部分的掩模。# 中心部分掩模的形状为椭圆形。这样能够有效区分中心部分和边缘部分,从而在getHistogram()方法中对不同部位的色彩特征做加权处理。segments = [(0, centerX, 0, centerY), (0, centerX, centerY, height), (centerX, width, 0, centerY), (centerX, width, centerY, height)]# 初始化中心部分axesX, axesY = int(width * 0.75) / 2, int (height * 0.75) / 2ellipseMask = numpy.zeros([height, width], dtype="uint8")cv2.ellipse(ellipseMask, (int(centerX), int(centerY)), (int(axesX), int(axesY)), 0, 0, 360, 255, -1)#cv2.ellipse(ellipMask, (int(cX), int(cY)), (int(axesX), int(axesY)), 0, 0, 360, 255, -1)# 初始化边缘部分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)# 得到边缘部分的直方图imageHistogram = self.getHistogram(image, cornerMask, False)features.append(imageHistogram)# 得到中心部分的椭圆直方图imageHistogram = self.getHistogram(image, ellipseMask, True)features.append(imageHistogram)# 得到最终的特征值return features

structure_descriptor.py

# -*- coding: utf-8 -*-
# !/usr/bin/env python
# @Time    : 2018/11/6 15:18
# @Author  : xhh
# @Desc    : 构图空间提取器
# @File    : structure_descriptor.py
# @Software: PyCharm
import cv2
# 将图片进行归一化处理,返回HSV色彩空间矩阵
class StructureDescriptor:__slot__ = ["dimension"]def __init__(self, dimension):self.dimension = dimensiondef describe(self, image):image = cv2.resize(image, self.dimension, interpolation=cv2.INTER_CUBIC)# 将图片转化为BGR图片转化为HSV格式image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)# print(image)return image

searchEngine.py

# -*- coding: utf-8 -*-
# !/usr/bin/env python
# @Time    : 2018/11/6 15:21
# @Author  : xhh
# @Desc    :
# @File    : searchEngine.py
# @Software: PyCharm
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)# 传入色彩空间的bins
colorDescriptor = color_descriptor.ColorDescriptor(idealBins)
# 传入构图空间的bins
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)

index.py

# -*- coding: utf-8 -*-
# !/usr/bin/env python
# @Time    : 2018/11/6 15:20
# @Author  : xhh
# @Desc    :
# @File    : index.py
# @Software: PyCharm
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"] + "/*.png"):imageName = imagePath[imagePath.rfind("\\") + 1 : ]   # 这里也是需要修改的image = cv2.imread(imagePath)features = colorDesriptor.describe(image)# 将色彩空间的特征写入到csv文件中去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" + "/*.png"):# imageName = imagePath[imagePath.rfind("/") + 1 : ]   # 这里是需要修改的imageName = imagePath[imagePath.rfind("\\") + 1 : ]image = cv2.imread(imagePath)structures = structureDescriptor.describe(image)# 将构图空间的色彩特征写入到文件中去  write structures to filestructures = [str(structure).replace("\n", "") for structure in structures]output.write("%s,%s\n" % (imageName, ",".join(structures)))
# close index file
output.close()

searcher.py

# -*- coding: utf-8 -*-
# !/usr/bin/env python
# @Time    : 2018/11/6 15:19
# @Author  : xhh
# @Desc    : 图片搜索内核
# @File    : searcher.py
# @Software: PyCharm
import numpy
import csv
import reclass Searcher:# colorIndexPath色彩空间特征索引表路径,structureIndexPath结构特征索引表路径__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 = 0normalizeRatio = 5e3for index in range(len(queryStructures)):for subIndex in range(len(queryStructures[index])):a = structures[index][subIndex]b = queryStructures[index][subIndex]distance += (a - b) ** 2 / (a + b + eps)return distance / normalizeRatiodef 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 = 0feature = re.split("\s+", feature)rmlist = []for index, strValue in enumerate(feature):if strValue == "":rmlist.append(index)for _ in range(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]] = distanceindexFile.close()# print "feature", sorted(searchResults.iteritems(), key = lambda item: item[1], reverse = False)return searchResultsdef 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 queryStructuresdef 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]] = distanceindexFile.close()# print "structure", sorted(searchResults.iteritems(), key = lambda item: item[1], reverse = False)return searchResultsdef search(self, queryFeatures, rawQueryStructures, limit = 6):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]

在这里返回的结果集只有一个值:

运行:我是在windows10下项目下直接cmd的

步骤:

1.提取特征图片的直方图特征,以及图片的构图空间特征,index.csv

python index.py --dataset dataset --colorindex color——index.csv --structure structure_index.csv

2.图片查找:

python searchEngine.py -c color_index.csv -s structure_index.csv -r dataset -q query/mm.png

        查找出来的图片,感觉差不多   

注意:

对于灰度图,在这里效果很差,,我对一个图片进行处理转化为灰度图处理了之后,在进行相似图片的查找直接放图吧

查找出来的图片:

效果很差

以上的相似图片的搜索,利用的直方图的差异来查找,,直方图只是对色彩空间的敏感度高,后续还需要要改进,也利用了hash值来计算,后续在贴出来吧。

大家可以关注我和我小伙伴的公众号~~~这里有我和我的小伙伴不定时的更新一些python技术资料哦!!大家也可以留言,讨论一下技术问题,希望大家多多支持,关注一下啦,谢谢大家啦~~

python+opencv实现相似图片的搜索相关推荐

  1. python+opencv将表格图片按照表格框线分割、识别

    如下小程序为使用python+opencv将表格图片,按照表格进行分割,并识别分割后的子图片中的文字,希望对需要的小伙伴有一些些帮助.具体的实现见如下代码. # -*- coding: utf-8 - ...

  2. python opencv 如何给图片添加文字?cv2.putText() PIL

    参考文章1:python如何在图片上添加文字(中文和英文)Python在图片上添加文字的两种方法:OpenCV和PIL 参考文章2:python之------如何在图片上面添加文字(多种类型的文字)[ ...

  3. python+opencv人脸识别-图片处理+代码

    首先安装opencv: cmd 然后输入:install opencv-python 刚接触人脸识别,正在学习:代码是从绘制图片到人脸识别,里面的jpg图片找个有一个人脸图片就行,放在项目的根目录下就 ...

  4. python opencv轻松去图片水印

    背景 最近有一个需要为图片去水印的需求,于是各种折腾开始. 背景了解图片标准 图片使用RGB编码,RGB色彩模式是工业界的一种颜色标准,是通过对红(R).绿(G).蓝(B)三个颜色通道的变化以及它们相 ...

  5. Python+OpenCV批量给图片加噪声

    利用python和opencv批量给图像加噪声(椒盐噪声.高斯噪声.随机噪声) 导入头文件 import os import cv2 import numpy as np import random ...

  6. python opencv numpy旋转图片

    python旋转图片 背景 在图像处理中,有的时候会有对图片进行角度旋转的处理,尤其是在计算机视觉中对于图像扩充,旋转角度扩充图片是一种常见的处理.这种旋转图片的应用场景也比较多,比如用户上传图片是竖 ...

  7. Python+Opencv实现把图片转为视频

    1. 安装Opencv包 在Python命令行输入如下命令(如果你使用的Anaconda,直接进入Anaconda Prompt键入命令即可.如果你不知道Anaconda是什么,可以参考王树义老师的文 ...

  8. python opencv 三维重建_【python+opencv实现基于图片序列的三维重建】 - #1

    2015年09月05 - 三维重建一直是机器视觉研究的热门方向,比如,基于双目视觉,单目视觉,多视几何,光场三维重建等等. 每一种方法都有其有点和局限性.单目视觉需要拍摄多幅图像,并且在拍摄过程中需要 ...

  9. Python+opencv裁剪/截取图片的几种方式

    文章目录 前言 一.手动单张裁剪/截取 二.根据图片的位置坐标进行裁剪/截取 三.根据xml文件截取/裁剪目标 四.opencv获取边缘并根据bounding box截取/裁剪目标 五.用YOLO目标 ...

  10. Python OpenCV 实现对图片旋转矩形的裁剪

    前言: 最近需要实现一个在一张大图上给定一个带方向的点,以这个点为中心,以方向为角度裁剪出一个矩形区域.在网上查到很多方法都是先对大图像进行旋转,再从中切片取出目标区域.不失为一个好办法,但是我要处理 ...

最新文章

  1. 用Leangoo看板进行可视化的缺陷跟踪管理
  2. 基于docker部署的微服务架构(九): 分布式服务追踪 Spring Cloud Sleuth
  3. Oracle Golden Gate 系列十七 -- GG 一对多 real-time data distribution 说明 与 示例
  4. Algorithm:树相关算法(BBT/BST/B树/R树)简介(二叉查找树、二叉查找树的插入节点、二叉查找树的删除、二叉树的遍历、平衡二叉树)C 语言实现
  5. 自定义一个SharedPreferences工具类
  6. 【视频】网易杭州研究院副院长汪源2016QCon大会专访
  7. Java Jar包的压缩、解压使用指南
  8. 2014年去哪儿网笔试题--一个10*10的矩阵(可以理解为棋盘),随时生成一组数据填入矩阵,任何一个位置的数字除4进行计算,按余数着色......
  9. 【路径规划】基于A星算法机器人静态避障路径规划matlab代码
  10. php中case的使用,php:switchcase语句的使用案例
  11. PCL教程-PCLVisualizer可视化类的使用
  12. easyx带笔锋的涂鸦板!
  13. [半闲之人] 关于SteamVR摄像机和普通摄像机冲突的解决办法
  14. C# Socket客户端采用双线程断网重连断线重连)
  15. 微信运营:自媒体人必须知道的20个自媒体平台
  16. h5 canvas html 合成,图片合成以及canvas的应用
  17. TypeScipt -回调函数
  18. FindDifferent - QQ游戏快速找茬工具
  19. 用 Python 写了一个电子考勤系统
  20. “四位一体 扬升计划”横空出世 用友全面释放ISV伙伴创新原力

热门文章

  1. LOJ10064黑暗城堡
  2. 离散数学1-数理逻辑的基本概念
  3. 从“中国宙斯盾”亮相想到的
  4. vue移动端点击事件延迟_如何解决移动端Click事件300ms延迟的问题?
  5. an error occurred while creating opening the c++ browsing database 解决办法
  6. sklearn中make_blobs模块使用
  7. 华为云服务的使用方法详解--以照片备份与恢复为例
  8. R语言可视化——熵曲线
  9. TK1 刷机教程---使用JETPACK
  10. 共享单车被带到乡下私用,警方:或涉嫌盗窃