百度360必应搜狗淘宝本站头条
当前位置:网站首页 > SEO教程 > 正文

谷歌百度以图搜图如何实现?教你打造属于自己的相似图片搜索引擎

gaoyangw 2024-12-08 13:44 20 浏览 0 评论

前情回顾:

图片颜色直方图

前期文章,我们分享了图片的3D颜色直方图,利用颜色直方图是反映图片的像素的分布状态,当然不同的图片,其颜色直方图肯定有所不同,利用不同图片的颜色直方图的对比值,便可以很容易找到2张相似的图片。

图片的3D颜色直方图:

既然要使用图片的颜色直方图来进行相似图片的对比,首先需要对图片进行直方图的数据收集与保持

import pickle
import cv2
import os

class RGBHistogram:
  def __init__(self, bins):
    self.bins = bins

  def describe(self, image):
    hist = cv2.calcHist([image], [0, 1, 2],None, self.bins, [0, 256, 0, 256, 0, 256])
    hist = cv2.normalize(hist,hist)
    return hist.flatten()

首先我们建立一个计算图片 RGB空间的3D颜色直方图函数,利用此函数来进行图片直方图的计算工作

我们依然使用cv2.calcHist函数来进行图片直方图的计算,关于此函数的具体参数定义,可以参考往期文章,这里我们一般搜索的图片为彩色图片,所以计算图片的RGB空间直方图

然后使用cv2.normalize opencv 图片归一化函数(归一化数据。该函数分为范围归一化与数据值归一化),通俗地讲就是将矩阵的值通过某种方式变到某一个区间内,这样可以有效的节约计算机空间来计算

Cv.normalize(InputArry src,InputOutputArray dst,double alpha=1,
             double beta=0,int norm_type=NORM_L2,int dtype=-1,InputArray mark=noArry())
  1. · src 输入数组;
  2. · dst 输出数组,数组的大小和原数组一致;
  3. · alpha 1,用来规范值,2.规范范围,并且是下限;
  4. · beta 只用来规范范围并且是上限;//为0时则为值归一化,否则为范围归一化
  5. · norm_type 归一化选择的数学公式类型;
  6. · dtype 当为负,输出在大小深度通道数都等于输入,当为正,输出只在深度与输入不同,不同的地方由dtype决定;
  7. · mark 掩码。选择感兴趣区域,选定后只能对该区域进行操作。

然后返回flatten数组形式的3D图片直方图

收集图片直方图数据:

建立好了图片直方图函数,便可以收集我们的图片直方图的数据,这里跟我们首先需要神经网络类似,需要有前期的"预训练模型"

index = {}
desc = RGBHistogram([8, 8, 8])
list_images = []
for root, dirs, files in os.walk("images"):
  for file in files:
    list_images.append(os.path.join(root, file))

for imagePath in list_images:
  k = imagePath[imagePath.rfind("/") + 1:]
  image = cv2.imread(imagePath)
  features = desc.describe(image)
  index[k] = features

with open("index.cpickle", "wb") as f:
  f.write(pickle.dumps(index))

index{} 字典用来保存图片的路径与图片直方图数据

for root, dirs, files in os.walk,首先使用os.walk 函数遍历整个图片的文件夹来获取图片的相对路径地址

我们按照imagePath[imagePath.rfind("/") + 1:]图片的路径作为key , 图片的features = desc.describe(image)直方图数据作为value组成一个index字典用来保存图片的数据

待获取了图片的字典数据后,我们使用f.write(pickle.dumps(index))

保存图片的直方图数据,以便后期进行搜索使用,当然这部分数据可以保存到自己的服务器上,当用户搜索相识图片时,前端获取用户的图片数据,服务器进行相识图片检索,然后返回前端检索到的图片数据进行图片的展示。

以上我们搜集了图片的直方图数据,并保存了数据,这点跟我们前期讲解的神经网络的预训练模型类似,下一步当然是进行"神经网络的预测"进行图片的检测

相关图片的搜索:

想要进行图片的相识图片搜索工作,首先保证前面几个步骤已经完成,且保存了自己的数据,接下来当然是接受用户的输入图片,进行图片的相识性搜索

import numpy as np
import os
import pickle
import cv2

class RGBHistogram:
  def __init__(self, bins):
    self.bins = bins
  def describe(self, image):
    hist = cv2.calcHist([image], [0, 1, 2],
    None, self.bins, [0, 256, 0, 256, 0, 256])
    hist = cv2.normalize(hist,hist)
    return hist.flatten()

首先我们建立图片直方图的函数,这里这个函数主要是把用户传递过来的图片进行图片直方图的操作,函数的具体含义参考以上文章内部

然后我们新建一个搜索函数,主要处理输入直方图与数据库直方图的对比

class Searcher:
  def __init__(self, index):
    self.index = index
  def search(self, queryFeatures):
    results = {}
    for (k, features) in self.index.items():
      d = self.chi2_distance(features, queryFeatures)
      results[k] = d
      results = sorted([(v, k) for (k, v) in results.items()])
      return results

  def chi2_distance(self, histA, histB, eps = 1e-10):
    d = 0.5 * np.sum([((a - b) ** 2) / (a + b + eps)
      for (a, b) in zip(histA, histB)])
    return d

首先我们加载index数据库,这里保存了图片的直方图数据

然后遍历所有index的数据for (k, features) in self.index.items():计算每个数据库中的图片直方图与输入图片直方图的卡方距离

卡方距离越小,说明2张图片越相似

利用sorted 函数sorted([(v, k) for (k, v) in results.items()])

对图片卡方距离进行排序,以便最小的距离值排列在最前面

初始化数据

queryImage = cv2.imread("queries/11.png")
cv2.imshow("Query", queryImage)
desc = RGBHistogram([8, 8, 8])
queryFeatures = desc.describe(queryImage)
index = pickle.loads(open("index.cpickle", "rb").read())
searcher = Searcher(index)
results = searcher.search(queryFeatures)
montageA = np.zeros((166 * 3, 400, 3), dtype="uint8")
montageB = np.zeros((166 * 3, 400, 3), dtype="uint8")

首先接受用户传递的图片

desc = RGBHistogram([8, 8, 8])

queryFeatures = desc.describe(queryImage)

使用以上函数计算用户图片的颜色直方图

index = pickle.loads(open("index.cpickle", "rb").read())

searcher = Searcher(index)

初始化颜色直方图搜索引擎数据,主要是打开服务器上的图片直方图数据进行图片的搜索

results = searcher.search(queryFeatures)

进行图片的相似性检索

tageA = np.zeros((166 * 3, 400, 3), dtype="uint8")

tageB = np.zeros((166 * 3, 400, 3), dtype="uint8")

初始化2个标签,用来展示我们搜索到的相似图片,这里我们方便查看设置了6张图片的展示

每个图片resize 到400*166

当然你完全可以只展示一张最相似的图片

我们检索了所有数据库中的图片,结果已经存放在results数组中,由于我们sorted了数组,所以最小值的前六个数组当然在数组最前面,我们只需要提取前6个数据即可

for j in range(0, 6):	
	(score, imageName) = results[j]
	path = os.path.join(imageName)
	result = cv2.imread(path)
	if j < 3:
		tageA[j * 166:(j + 1) * 166, :] = result
	else:
		tageB[(j - 3) * 166:((j - 3) + 1) * 166, :] = result
cv2.imshow("Results 1-3	", tageA)
cv2.imshow("Results 4-6	", tageB)														
cv2.waitKey(0)	

遍历前6个数据,获取图片保存的路径地址与每个图片相似度的置信度

把前3个图片数据保存到tageA中,后3个图片数据保存到tageB中,最后便可以成功展示我们检索到的6张相似图片

这里程序成功的找到了相似图片,小编这里复制了3张图片,程序能够完美找到图片

相关推荐

Everything:Windows平台最强大的文件搜索神器推荐

Windows自带的搜索功能一直是让用户头疼的问题。搜索效率低下、功能不完善、响应缓慢,甚至有时明明知道文件就在某个文件夹中,却怎么也搜索不出来。现在的Windows很多时候都给我个感觉,微软操作系统...

谈谈目前最好用的文件搜索神器(强大的文件搜索软件有哪些)

Everything是由...

深度解析:如何做好网站SEO优化服务,提升网站排名

https://txc.qq.com/products/755566/blog/1790183https://txc.qq.com/products/755419/blog/1790181https:...

JDG第一,GEN第二!S13全球总决赛夺冠热门Top10

伴随着2023全球总决赛即将到来,关于本届世界赛有哪些有机会夺冠的队伍也成为了不少网友们讨论的焦点。而在近日,国外网站目前更新了各大参赛队伍的夺冠热门排名。那么,具体情况如何?就让我们一起来了解一下吧...

7大热门查重降重网站汇总,论文写作必备!(部分免费)

查重,是论文写作的必备流程。...

大量恶意广告影响荷兰的热门网站(宣传荷兰的广告句子)

阅读:26次点赞(0)收藏4月10号,Fox-IT安全指挥中心检测到了大量与漏洞利用工具有关的攻击事件。这些安全事件起源于针对荷兰网站的大规模恶意广告活动。我们在下面列出了受影响的荷兰网站站点,这些...

热门视频素材网站的在哪里找?(视频素材网址)

身为短视频剪辑者来说,不管是国内的,还是国外的,大多数都使用过了。下面分享俺剪辑多年视频后,探索出来的经典视频素材,都是榜上有名的,介绍最全的一篇,你来看看就知道啦!...

我用PPT做了1个视频,却上了B站热门!这个超酷动画库分享给你

...

热门AI视频生成网站,看这个榜单就够了

热门AI视频生成网站,看这个榜单就够了

八大受到网友一致好评的经典著作,每一本都火出天际

火的小说很多,但这么火的也是很少见的。今天就给大家来盘一盘这几本火出天际的网文经典著作,都是不少书友们的入坑神作啊。...

个人隐私遭泄露?这3类“不良网站”才是罪魁祸首!网友:不早说

大家都知道,在网络信息时代,毫无个人隐私可言,很多人每天都会收到一些垃圾短信、骚扰电话,而且使用微信、QQ时,也经常遇到陌生人,发来的“好友申请”,但实际上,这些问题,通过设置电话、短信拦截功能,就能...

想约会吗?泰国7大最热门交友程序和网站,让你情人节不孤单

空气中弥漫着爱意,情人节即将来临。但是,如果你还没有约会,别担心!还有不到一周的时间,感谢技术的力量,我们仍然有时间找到那个特别的人。有了如此多的约会应用程序和网站,与潜在的匹配对象建立联系并找到火花...

消息称微软将为Win11任务栏加入“推荐”,展示热门网站/应用

IT之家11月10日消息,据消息源Phantomofearth透露,在近期的Windows11Build27723版本中,系统新增一项名为“SnapGroupsRecommend...

TopList:一款获取各大热门网站热门头条的聚合网站

开源地址:https://github.com/tophubs/TopList...

好玩有趣的十款网页小游戏推荐,上班摸鱼爽到不行!

分享十款好玩有趣的网页小游戏,打开就能玩,随便哪个都能玩上一整天,赶紧看过来~花光比尔盖茨的钱入口:https://neal.fun/spend/这个网站会模拟拥有比尔盖茨的900亿美元资产,内置可购...

取消回复欢迎 发表评论: